【问题标题】:String to int cast in php在 php 中转换为 int 的字符串
【发布时间】:2016-11-24 10:04:04
【问题描述】:

好的,我只是在尝试使用 PHP 时偶然发现了一个奇怪的行为
验证用户输入是否为整数。

当我尝试将字符串 12345A 转换为 int e.g

$int_var = (int)'12345A';

我得到 12345。

为什么 PHP 不抛出异常,而是默默地省略了 'A'?

【问题讨论】:

  • 因为这就是它的设计目的?
  • 那么我应该循环遍历字符串并检查字符是否为数字?
  • 当你有一个 32 位系统并且你想要一个比 PHP_MAX_INT 更高的巨大 int 时,后者更好。
  • 你到底想做什么?

标签: php string validation casting


【解决方案1】:

PHP tries to convert字符串的初始部分为整数类型:

该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,这将是使用的值。否则,该值为 0(零)。

如果要转换的变量是标量,则类型转换功能不应引发异常或以任何其他方式失败。如果变量是一个对象,它会触发一个通知,但是仍然会执行转换。

如果要检查,如果$t变量包含数值,使用is_numeric

if (is_numeric($t)) {
  // ...
}

不要使用is_int,因为如果$t 是类似'1234' 的字符串(通常是这种情况),那么is_int 将返回false,因为类型是string,但是不是int

另外,在检查之前考虑trimming $t

$t = trim($t);

因为用户可能会提交类似" 123" 的内容。但应用程序通常不应仅仅因为前导空格而失败。

【讨论】:

    【解决方案2】:

    当您进行这样的转换时,PHP 会尽力转换为数字,包括去除非数字字符。

    如果你想确定它是一个int,你可以使用is_int(),如:

    $t = '12345A';
    if (!is_int($t)) throw new Exception('Not an integer: ' . $t);
    

    【讨论】:

    • 这将失败,因为 $t 不是整数,它是一个字符串。查看接受的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多