【发布时间】:2017-05-19 06:01:18
【问题描述】:
我在 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_* 函数并抛出异常吗?
【问题讨论】:
-
如果你想要 strict 类型,你可以争论,不要使用 php。它的优点之一是它的松散类型
-
@raina77ow 是的,是的,这有点奇怪。奇怪的是,它可以正常工作。实际上,如果有人可以向 PHP 开发组发布错误报告,我会非常高兴,因为 PHP 7.1 也受到了影响;而且我不太擅长编写正确的错误报告。
-
@Dagon 没错,但每种编程语言都有其优点和缺点。
-
@raina77ow 这太可悲了。只要这些函数有这个错误,我想我会坚持使用旧的
foreach并在循环内进行验证。谢谢你在这个话题@raina77ow 的安慰。 -
这看起来确实像一个 php 错误 github.com/php/php-src/blob/master/ext/standard/array.c#L1636
标签: php types type-hinting