У меня есть следующий объект значения 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);"int(2147483647)
C:\Users\Niet>php -r "var_dump(2147483648);"float(2147483648)
Обратите внимание, как второй не целое число, потому что оно вышло за пределы того, что может быть сохранено в целое число. Следовательно, is_int
возвращает ложь
Чтобы исправить это, рассмотрите возможность использования функций BCMath для обработки произвольно больших чисел.
2147483647 — это максимально возможное 32-разрядное целое число со знаком. Если вы хотите представить большие числа, вам нужно запустить 64-битный PHP на 64-битной машине.
В качестве альтернативы вы можете использовать BCMath расширение.
Тем не менее, вы никогда не сможете иметь компьютер точно хранить любой положительное число. На данный момент все, что выше 2 ^ 64, лучше всего хранить в виде строки.