我在PHP 7.0.11,其中跨一个非常有趣的错误来declare(strict_types=1);启用不作array_map()也不array_walk()知道严格typehinting的.我在某处读到,通过启用严格类型,PHP在核心函数中也使用了严格的类型,但事实并非如此.看看这个示例代码,它应该抛出TypeError异常:
declare(strict_types=1);
$myArray = [12, 'string value', 'another string value', 5];
array_map('validateMyArrayValues', $myArray);
function validateMyArrayValues(string $item)
{
var_dump($item);
}
Run Code Online (Sandbox Code Playgroud)
该var_dump结果是:
test.php:13:
string(2) "12"
test.php:13:
string(12) "string value"
test.php:13:
string(20) "another string value"
test.php:13:
string(1) "5"
Run Code Online (Sandbox Code Playgroud)
所有整数值都被拼接成字符串,这显然是一个问题.这引出了一个问题,我应该declare(strict_types=1);放在一起并使用is_*函数并抛出异常吗?
这不是一个错误(11号房间的尖端指示我指向正确的方向)
这是严格类型RFC.它真的,非常长,是PHP历史上最具争议的RFC(而且我很认真).这是为您准备的相关部分
对于内部和用户功能,此提议默认情况下使用弱类型检查(使用相同的规则).
-
PHP社区的很大一部分似乎都支持完全严格的类型.但是,添加严格类型检查的标量类型声明会导致一些问题:
如果函数调用向参数添加标量类型声明,那么(可能无意中)利用PHP的弱类型的现有代码将会中断.这会使标量类型声明添加到现有代码库(尤其是库)中的函数参数中.
所以这不是一个错误.这是使这成为可能的重大妥协的一部分(如果你愿意的话,宝宝会采取更严格的打字方式).函数忽略严格键入.是的,它与其他语言不一致(RFC详细说明了这一事实),但这就是PHP社区现在应该如何决定的.