臧富祥 ^回到顶部

您的当前位置:首页 > php资讯 > PHP基础 > php7整理-特性

php7整理-特性

所属分类: PHP基础   2020-03-23 13:11:24  编辑:admin  浏览次数 511 次

强制模式(默认)和严格模式

示例 - 强制模式

<?php
   // Coercive mode
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>


这将在浏览器产生输出以下结果-

9


示例 - 严格模式

<?php
   // Strict mode
   declare(strict_types=1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>


这将在浏览器产生输出以下结果-

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...


示例 - 有效的返回类型

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value;
   }
   print(returnIntValue(5));
?>


这将在浏览器产生输出以下结果-

5


示例 - 无效的返回类型

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value + 1.0;
   }
   print(returnIntValue(5));
?>


这将在浏览器产生输出以下结果-

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer,
float returned...

标量声明

在 PHP7 中为了提高执行效率,引入了一个新的功能,即在函数方法中增加了 Scalar 类型声明(标量类型声明),这样做节省了对数据类型的检测。标量类型声明有如下的两个选项:

  • 强制模式:强制是默认的模式,不需要指定。

  • 严格模式:严格的模式必须明确暗示。RFC 给每一个 PHP 文件,添加一句新的可选指令(declare(strict_type=1);),让同一个 PHP 文件内的全部函数调用和语句返回,都有一个“严格约束”的标量类型声明检查。

可以使用上述模式强制执行以下类型的函数参数:


  • int

  • float

  • bool

  • string

  • interfaces

  • array

  • callable

强制模式-示例

<?php    // Coercive mode    
function sum(int ...$ints) {       
return array_sum($ints);    
}    
print(sum(2, '3', 4.1)); 
?>

运行上述代码,它产生以下浏览器输出:

9

严格模式-示例

<?php    // Strict mode    
declare(strict_types=1);    
function sum(int ...$ints) {      
return array_sum($ints);    
}    
print(sum(2, '3', 4.1)); 
?>

运行上述代码,它产生以下浏览器输出:

PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in /soft/node/run.php on line 7 and defined in /soft/node/run.php:4 Stack trace: #0 /soft/node/run.php(7): sum(2, '3', 4.1) #1 {main} Next TypeError: Argument 3 passed to sum() must be of the type integer, float given, called in /soft/node/run.php on line 7 and defined in /soft/node/run.php:4 Stack trace: #0 /soft/node/run.php(7): sum(2, '3', 4.1) #1 {main} thrown in /soft/node/run.php on line 4

严格模式的校验行为:严格的类型校验调用拓展或者 PHP 内置函数,会改变 zend_parse_parameters 的行为。特别注意,失败的时候,它会产生E_RECOVERABLE_ERROR 而不是E_WARNING。严格类型校验规则是非常直接的:只有当类型和指定类型声明匹配,它才会接受,否则拒绝。

有效返回类型-实例

<?php    
declare(strict_types = 1);    
function returnIntValue(int $value): int {       
return $value;    
}    
print(returnIntValue(5)); 
?>

它产生以下浏览器输出:

5

<?php    function arraysSum(array ...$arrays): array{       
return array_map(function(array $array): int {       
return array_sum($array);     
}, $arrays);    
}    
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9])); 
?>

它产生以下浏览器输出:

Array ( [0] => 6 [1] => 15 [2] => 24 )

返回类型无效-实例

<?php    
declare(strict_types = 1);    
function returnIntValue(int $value): int {       
return $value + 1.0;    
}    
print(returnIntValue(5)); 
?>

它产生以下浏览器输出:

PHP Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned in /soft/node/run.php:4 Stack trace: #0 /soft/node/run.php(6): returnIntValue(5) #1 {main} thrown in /soft/node/run.php on line 4

PHP文章检索

PHP文章目录