项目升级到PHP7后是否要开启严格模式?

PHP7增加了严格模式设置,在开启严格模式后,形参和返回类型必须严格符合定义,不符合定义则报Fatal Error.

检查以下代码:

function test(int $a): array {
    return compact('a');
}

print_r(test('123'));
print_r(test('123A'));
print_r(test('A123'));

test函数拥有一个int类型的形参和一个array返回参数,三次调用都是使用字符串类型作为实参。'123'和'123A'在PHP弱类型下都可以转换为int。

在未开启严格模式时,第一个打印并不会报任何错误,第二个类型会报Notice错误,第三个类型则报Fatal错误,可见在函数调用时,或根据函数的形参定义,对实参进行自动转换,再进行调用,所以只有在未转换成形参期待的类型时才会报Fatal Error。

顶部添加以下代码,开启严格模式后:

declare(strict_types = 1);

三个打印都会变成Fatal Error,这说明开启了严格模式后,整个页面变成了强类型编程模式,不再对变量类型进行自动转换。

PHP的严格模式并非将PHP整体变为强类型语言模型,只是对函数的形参和返回参数做出了严格限制。PHP7以后增加函数的形参和返回参数确实为我们提供了遍历,可以让我们在接口约束之外增加了更多的约束手段。但是不是一定要对它们做出强制约束,我认为未必。理由如下:

  1. 在脚本解释过程中,强类型未必会带来更高的性能,反而失去弱类型的便利;
  2. 旧项目迁移,开启严格模式,会浪费大量的时间;
  3. 即使未来PHP加入JIT,也90%可能不是建立在强类型的基础上的。

发表回复

您的电子邮箱地址不会被公开。