Php 大于2147483647的正整数仍然抛出InvalidArgumentException

Php 大于2147483647的正整数仍然抛出InvalidArgumentException,php,integer,Php,Integer,我得到了下面的值objectSeriesNumber,它应该能够包含任何正整数。但当我将值设置为大于2147483647的值时,会抛出错误,但这显然是一个正整数 我如何才能摆脱这种限制或奇怪的行为,例如,我可以使用8750465442或更高的值作为我的序列号 namespace Model\Domain\User\Value; use \InvalidArgumentException; class SeriesNumber { private $value; public

我得到了下面的值object
SeriesNumber
,它应该能够包含任何正整数。但当我将值设置为大于2147483647的值时,会抛出错误,但这显然是一个正整数

我如何才能摆脱这种限制或奇怪的行为,例如,我可以使用8750465442或更高的值作为我的序列号

namespace Model\Domain\User\Value;

use \InvalidArgumentException;

class SeriesNumber
{
    private $value;

    public function __construct($value)
    {
        $this->setValue($value);
    }

    public function __toString()
    {
        return (string) $this->value;
    }

    private function setValue($value)
    {
        if (!(is_int($value) && $value >= 1)) {
            throw new InvalidArgumentException(sprintf('%s must be a positive integer.', __METHOD__));
        }

        $this->value = $value;
    }
}
C:\Users\Niet>php-r“var_dump(2147483647);”
国际电话(2147483647)
C:\Users\Niet>php-r“var_dump(2147483648);”
浮动(2147483648)
请注意,第二个不是整数,因为它超出了可以保存在整数中的范围。因此,
is_int
返回false


修复,考虑使用BCMAX函数处理任意大数。

< P> 2147483647是最大可能签名的32位整数。如果要表示较大的数字,需要在64位计算机上运行64位PHP

或者,您可以使用扩展名


也就是说,你永远无法让计算机准确地存储任何正整数。目前,任何高于2^64的数据都最好保存为字符串。

但是当我把它放在字符串中时,我可以使用非常大的数字。我认为这是一个解决方案,但为什么呢?@kiddmond,因为字符串不是数字。数字
2147483647
占用4个字节,而字符串
“2147483647”
占用11个字节。在字符串中,每个字符由一个[或多个UTF]字符表示,字符串本身以
\0
NULL
字节终止。您可以很容易地在CPU中对一个数字执行基本的数学操作,将一个数字表示为一个字符串,您需要加载一个特殊的库来完成这些奇怪的事情,例如:BCmath。@Sammitch PHP字符串不是以null结尾的。为了证明这一点,请尝试
var_dump(“\x00\x00\x00”)-您将得到一个长度为3的字符串。PHP是一种解释语言,位于C之上,C字符串以null结尾。@Sammitch非常确定PHP字符串实际上是作为字符数组处理的。