declare(strict_types=1)·开启严格模式的注意事项

<?php
declare(strict_types=1); // 开启严格模式,该行必须为第一行代码
ini_set('display_errors', 'On'); // 将display_errors设置为On
error_reporting(-1); // 报告所有错误

/**
 * @param string $name 姓名
 * @param string $gender 性别
 * @param int $age 年龄
 * @return array
 */
function foo(string $name, string $gender, int $age): array
{
    $profile = [];

    $profile['name'] = $name;
    $profile['gender'] = $gender;
    $profile['age'] = $age;

    return $profile;
}

// 这里会报『Fatal error: Uncaught TypeError』错误,因为foo()的第3个形参$age声明为int类型,但入参的却是字符串'18'
$profile = foo('张三', '男', '18');
// Fatal error: Uncaught TypeError: foo(): Argument #3 ($age) must be of type int, string given

var_dump($profile); // 这里已经无法执行到了,因为上面出现了Fatal error

//========== 总结 ==========//
// 1、开启严格模式后,调用函数会检查其参数和返回值的数据类型,若数据类型和声明的不匹配就会报『Fatal error: Uncaught TypeError』错误。
// 2、严格模式的影响范围仅限于开启了严格模式的PHP脚本自身,被其包含的PHP脚本并不会因为被包含而连带开启严格模式,下面是例子说明:
//    ① A脚本开启严格模式,B脚本没有开启严格模式,并且B脚本包含A脚本,这时B脚本调用A脚本的函数就算数据类型不一致也能正常执行。
//    ② A脚本没有开启严格模式,B脚本开启严格模式,并且B脚本包含A脚本,这时B脚本调用A脚本的函数如果数据类型不一致就会报Fatal error。
//    简单来说如果想要整个项目都开启严格模式,就必须在所有PHP脚本都写上“declare(strict_types=1)”。
// 3、开启严格模式并没有强制要求函数的形参和返回值都必须声明数据类型,严格模式下也可以不声明数据类型,只是不声明数据类型就无法进行严
//    格检查,效果也就相当于没有开启严格模式。同样地,即便没有开启严格模式,函数的形参和返回值也可以声明数据类型,只是当实参和形参的
//    数据类型不一致时会发生隐式转换(实参转为形参声明的数据类型)。

Copyright © 2024 码农人生. All Rights Reserved