我在PHP 7.0.11中遇到了一个非常有趣的错误,其中启用declare(strict_types=1);
不会使array_map()
和array_walk()
知道严格的类型提示。我在某处读到,通过启用严格类型,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);
}
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"
所有整数值都被拼接成字符串,这显然是一个问题。如果我将declare(strict_types=1);
全部放在一起并使用is_*
函数并抛出异常,这就提出了一个问题?
答案 0 :(得分:5)
这不是一个错误(向Room 11提示我指向正确的方向)
这是Strict Types RFC。它真的,非常长,是PHP历史上最具争议的RFC(而且我很认真)。以下是为您准备的相关部分
对于内部和用户功能,此提案默认情况下使用弱类型检查(使用相同的规则)。
-
PHP社区的很大一部分似乎都支持完全严格的类型。但是,添加严格类型检查的标量类型声明会导致一些问题:
如果函数调用向参数添加标量类型声明,那么(可能无意中)利用PHP的弱类型的现有代码将会中断。这会使标量类型声明添加到现有代码库中的函数参数,特别是库中。
所以这不是一个错误。这是使这成为可能的重大妥协的一部分(如果你愿意的话,宝宝会采取更严格的打字方式)。函数忽略严格键入。是的,它与其他语言不一致(RFC详细说明了这一事实),但这就是PHP社区现在应该如何决定的。