未分类

PHP 的严格模式与非严格模式整理

非严格模式

PHP 7.0 增加标量类型声明,我的测试版本是 PHP 7.1.16。

非严格模式下,标量 int、float、string、bool 的类型声明,会做类型转换,例如参数声明为 int 型,但是传入的是 float 或 string 类型,则参数会转换为 int 型。此转换同样适用于函数返回值。

1
2
3
4
5
6
7
8
9
10
11
12
<?php

function test1(string $str) {
var_dump($str); // string(3) "123"
}

function test2(int $value) {
var_dump($value); // int(1)
}

test1(123);
test2(1.23);

严格模式

要使用严格模式,一个 declare 声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。 这个指令不仅影响参数的类型声明,也影响到函数的返回值声明(参见返回值类型声明,内置的PHP函数以及扩展中加载的PHP函数)。

默认情况下,如果能做到的话,PHP 将会强迫错误类型的值转为函数期望的标量类型。 例如,一个函数的一个参数期望是 string,但传入的是 integer,最终函数得到的将会是一个 string 类型的值。

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

严格类型仅用于标量类型声明,也正是因为如此,这需要 PHP 7.0.0 或更新版本,因为标量类型声明也是在那个版本中添加的。

参考