我遇到了PHP 7.0.11中一个非常有趣的错误,其中启用declare(strict_types=1);不会使array_map()array_walk()意识到严格的类型提示。我在某处读到,通过启用严格类型,PHP在核心函数中也使用了严格的typehinting,但事实并非如此。
看下面的示例代码,它应该抛出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_*函数并引发异常吗?

最佳答案

这不是一个错误(给Room 11指出了正确方向的提示)
这是Strict Types RFC。它是PHP历史上非常,非常长且争议最大的RFC(我是认真的)。这是为您剪裁的相关部分



  • 因此,这不是错误。这是使之成为可能的重大折衷的一部分(如果可以,请采取一些小步骤以实现更严格的键入)。函数会忽略严格的键入。是的,它与其他语言并不一致(RFC详细说明了这一点),但这就是PHP社区目前决定​​的方式。

    关于php - 启用严格类型提示后,array_map仍将转换类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41472406/

    10-13 06:39
    查看更多