php教程,如何理解严格模式declare(strict_types=1)?
发布于 作者:苏南大叔 来源:程序如此灵动~php
的严格模式它来了,这php
的进化和js
的进化,越来越接近了。这不,php7
、php8
都开始支持一个强类型严格模式。使用方式也是非常简单,就是在代码的最顶端加上一句话:declare(strict_types=1);
。那么,它具体的功能是怎么样的呢?在本文中将进行具体的讨论。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验和感悟。本文测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。
基本写法
严格模式的基本写法,就是在代码的顶端写上下面的这句代码:
declare(strict_types=1);
需要特别强调的是:和其它类似的声明一样,这句php
版本的严格模式声明,一定要放在代码的最顶端。否则就会收到如下错误提示信息:
Fatal error: strict_types declaration must be the very first statement in the script
可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError
。 唯一的一个例外是可以将integer
传给一个期望float
的函数。
严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。 一个没有启用严格模式的文件内调用了一个在启用严格模式的文件中定义的函数,那么将会遵循调用者的偏好(弱类型),而这个值将会被转换。
php.ini显示错误
这个严格模式的最大功能,就是没有错误制造错误。所以,如果达到了严格模式制造错误的条件,还没有显示任何错误信息提示的话,那么,唯一的可能性就是:php.ini
中禁止了错误输出。所以,请检查php.ini
中的display_errors
和error_reporting
。
如果使用php
代码检查的话,是这样的:
var_dump(ini_get("display_errors"));
var_dump(ini_get("error_reporting"));
在本文的测试环境里面,可以正常显示错误信息的。其输出值是:
string(1) "1"
string(5) "22527"
实际的php.ini
的设置值是:
display_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
严格模式效果
主要就是检测变量的类型type
,如果不对,就会报错。值得特别说明的是:如果没有定义严格模式的话,这些类型错误很有可能都是可以接受的,并不会报错。
测试代码如下:
<?php
declare(strict_types=1);
var_dump(ini_get("display_errors"));
var_dump(ini_get("error_reporting"));
function sum($a, $b) {
return $a + $b;
}
function sum2(int $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum2(1, 2));
var_dump(sum2(1.5, 2.5)); // 严格模式报错,非严格模式不报错,但是返回值3不符合预期
function sum3(float $a, float $b) {
return $a + $b;
}
var_dump(sum3(1, 2)); // 不报错,特例:int实参可以传递给float形参
这里定义了三个函数,关于形参的类型定义,是有所不同的。
- 第一个是传统的弱类型,并没有定义形参的类型。它不会引发
type
错误。 - 第二个是
int
类型的形参。调用不当的时候,就会引出错误。 - 第三个是
float
类型形参,传递int
类型的时候,并不出错。这个是特例。
第二个函数的调用,什么时候报错呢?
- 传递整型数字的时候,不报错。
- 传递浮点型实参,正常情况下来说,就是直接执行
ceil
取整操作,虽然不符合预期,但是不报错。 - 传递浮点型实参,外加严格模式的话。就会小题大做,无中生有。报错啦!
错误捕获
这种由于引入严格模式所带来的变量类型错误,是可以通过try catch
来捕获的。例如:
declare(strict_types=1);
function sum(int $a, int $b) {
return $a + $b;
}
try {
var_dump(sum(1.5, 2.5));
} catch (TypeError $e) {
echo '捕获错误: '.$e->getMessage();
}
相关文章
结束语
当然了,严格模式有严格模式的好处,只是苏南大叔还不是太适应。目前直观的感受就是:报错的几率大大增加。
更多php
相关经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。