【问题标题】:With strict types enabled, array_map converts types anyways启用严格类型后,array_map 无论如何都会转换类型
【发布时间】: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


【解决方案1】:

这不是错误(向Room 11 致敬,为我指明了正确的方向)

这是Strict Types RFC。它真的非常非常长,也是 PHP 历史上最有争议的 RFC(我是认真的)。这是为您剪下的相关部分

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

PHP 社区的很大一部分似乎偏爱完全严格的类型。但是,添加经过严格类型检查的标量类型声明会导致一些问题:

如果它调用的函数将标量类型声明添加到参数中,那么(可能是无意地)利用 PHP 的弱类型的现有代码将会中断。这会使向现有代码库(尤其是库)中的函数参数添加标量类型声明变得复杂。

所以这不是错误。这是使这成为可能的重大妥协的一部分(如果您愿意,可以向更严格的打字迈出一步)。函数忽略严格类型。是的,它与其他语言不一致(RFC 详细说明了这一事实),但这就是 PHP 社区现在决定的方式。

【讨论】:

  • 是的,这似乎是一个弱类型提示的情况(demo)。任何整数都可以转换为字符串,但只有“数字”字符串才能转换为整数。
  • 这是大惊小怪的时刻。感谢您的澄清@Machavity。我目前正在阅读严格类型 RFC,这真的很有趣。
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2021-06-16
  • 2019-06-04
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多