我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

php的严格模式它来了,这php的进化和js的进化,越来越接近了。这不,php7php8都开始支持一个强类型严格模式。使用方式也是非常简单,就是在代码的最顶端加上一句话:declare(strict_types=1);。那么,它具体的功能是怎么样的呢?在本文中将进行具体的讨论。

苏南大叔:php教程,如何理解严格模式declare(strict_types=1)? - php严格模式
php教程,如何理解严格模式declare(strict_types=1)?(图6-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验和感悟。本文测试环境:win10nginx@1.15.11php@8.2.10-nts

基本写法

严格模式的基本写法,就是在代码的顶端写上下面的这句代码:

declare(strict_types=1);

需要特别强调的是:和其它类似的声明一样,这句php版本的严格模式声明,一定要放在代码的最顶端。否则就会收到如下错误提示信息:

Fatal error: strict_types declaration must be the very first statement in the script

苏南大叔:php教程,如何理解严格模式declare(strict_types=1)? - 声明位置错误
php教程,如何理解严格模式declare(strict_types=1)?(图6-2)

可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。 唯一的一个例外是可以将integer传给一个期望float的函数。

严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。 一个没有启用严格模式的文件内调用了一个在启用严格模式的文件中定义的函数,那么将会遵循调用者的偏好(弱类型),而这个值将会被转换。

php.ini显示错误

这个严格模式的最大功能,就是没有错误制造错误。所以,如果达到了严格模式制造错误的条件,还没有显示任何错误信息提示的话,那么,唯一的可能性就是:php.ini中禁止了错误输出。所以,请检查php.ini中的display_errorserror_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

苏南大叔:php教程,如何理解严格模式declare(strict_types=1)? - php-ini-显示错误
php教程,如何理解严格模式declare(strict_types=1)?(图6-3)

严格模式效果

主要就是检测变量的类型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类型的时候,并不出错。这个是特例。

苏南大叔:php教程,如何理解严格模式declare(strict_types=1)? - 类型报错截图
php教程,如何理解严格模式declare(strict_types=1)?(图6-4)

第二个函数的调用,什么时候报错呢?

  • 传递整型数字的时候,不报错。
  • 传递浮点型实参,正常情况下来说,就是直接执行ceil取整操作,虽然不符合预期,但是不报错。
  • 传递浮点型实参,外加严格模式的话。就会小题大做,无中生有。报错啦!

苏南大叔:php教程,如何理解严格模式declare(strict_types=1)? - 特例不报错
php教程,如何理解严格模式declare(strict_types=1)?(图6-5)

错误捕获

这种由于引入严格模式所带来的变量类型错误,是可以通过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教程,如何理解严格模式declare(strict_types=1)? - 捕获类型错误信息
php教程,如何理解严格模式declare(strict_types=1)?(图6-6)

相关文章

结束语

当然了,严格模式有严格模式的好处,只是苏南大叔还不是太适应。目前直观的感受就是:报错的几率大大增加。
更多php相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php