【问题标题】:php: is_numeric treats leading and trailing spaces differentlyphp: is_numeric 以不同方式处理前导和尾随空格
【发布时间】:2019-07-05 09:07:47
【问题描述】:

我的php版本:

➜  ~ php -v
PHP 7.3.1 (cli) (built: Jan 10 2019 13:16:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

我不明白为什么函数is_numeric 中的间隔值会这样?

➜  ~ php -a

php > var_dump(is_numeric('0012432'));
bool(true)
php > var_dump(is_numeric(' 0012432'));
bool(true)
php > var_dump(is_numeric('0012432 '));
bool(false)

【问题讨论】:

    标签: php types type-conversion php-7.3


    【解决方案1】:

    接受数字字符串的核心 PHP 语言的所有其他部分也是如此。这是一个令人讨厌的不一致,但它是故意的,并且多年来一直如此。我个人打算在未来的版本中解决这个问题。

    【讨论】:

    • 很高兴看到这个功能在移动,这是 RFC 的一部分吗?由于性能影响,我认为 Nikita 提出了 PHP 内部讨论。它将成为以下RFC 的一部分吗?我喜欢跟踪这些变化,以便以后简化我的代码。谢谢!
    • @abestrad github.com/php/php-src/pull/2317,在草稿中,我打算尽快处理它
    【解决方案2】:

    此函数处理前导空格的方式与 is_int()、is_float()、is_real()、is_long() 和 is_double() 不同。

    is_numeric(" 12345") = true
    is_int(" 12345") = false
    is_float(" 12345") = false
    is_real(" 12345") = false
    is_long(" 12345") = false
    is_double(" 12345") = false
    

    我发现了针对这些情况的错误报告,不确定他们是否会解决这个问题,

    Bug report

    【讨论】:

    • 5 年前的错误报告,没有 cmets。此外,您可以对错误进行投票,也许他们会评论/关闭/修复等...
    • 我找到了pull request,但去年作者决定关闭它。他写道: 等了 6 个月让这个 3 岁的 PR 开始行动,我很有信心这将无处可去,所以我要关闭 PR。 github.com/php/php-src/pull/753
    • 谢谢,@abestard。我在这个错误报告中写了评论。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2019-12-16
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多