启用严格类型提示后,array_map会转换类型

时间:2017-01-04 20:08:33

标签: php security

我在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_*函数并抛出异常,这就提出了一个问题?

1 个答案:

答案 0 :(得分:5)

这不是一个错误(向Room 11提示我指向正确的方向)

这是Strict Types RFC。它真的,非常长,是PHP历史上最具争议的RFC(而且我很认真)。以下是为您准备的相关部分

  

对于内部和用户功能,此提案默认情况下使用弱类型检查(使用相同的规则)。

-

  

PHP社区的很大一部分似乎都支持完全严格的类型。但是,添加严格类型检查的标量类型声明会导致一些问题:
如果函数调用向参数添加标量类型声明,那么(可能无意中)利用PHP的弱类型的现有代码将会中断。这会使标量类型声明添加到现有代码库中的函数参数,特别是库中。

所以这不是一个错误。这是使这成为可能的重大妥协的一部分(如果你愿意的话,宝宝会采取更严格的打字方式)。函数忽略严格键入。是的,它与其他语言不一致(RFC详细说明了这一事实),但这就是PHP社区现在应该如何决定的。