Я видел эта тема на форуме, что заставляет меня связать упомянутую в теме проблему с целочисленными диапазонами.
По сути, поток предназначен для хранения большого целого числа и получения вывода в виде отрицательного числа.
Однако я не могу найти никакой информации о целочисленных диапазонах из libyaml или расширения PHP YAML. При вызове yaml_emit () с очень большим числом будет ли он приведен / усечен?
Например, если вы звоните yaml_emit()
с очень большим целым числом, но это целое число находится в пределах диапазона, разрешенного текущими двоичными файлами PHP, будет ли результат отличаться?
Это тесты, которые я сделал локально:
$ php -v; echo "==="; php --re yaml | head -n 1; echo "==="; php -r 'var_dump(PHP_INT_SIZE); echo yaml_emit([0x7FFFFFFF + 1, -0x80000000 - 1]);'
PHP 7.0.0 (cli) (built: Dec 3 2015 09:31:42) ( ZTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
===
Extension [ <persistent> extension #32 yaml version 2.0.0RC6 ] {
===
int(8)
---
- -2147483648
- 2147483647
...
Это означает, что yaml_emit()
будет рассматривать все целые числа содержимого как 32-битные целые числа. Если они находятся вне диапазона, они будут усечены.
Аналогично, это верно даже для 64-битных двоичных файлов PHP:
yaml_emit(0xFFFFFFFF) === yaml_emit(-1)
Кроме того, согласно Источник PECL YAML, похоже, что PHP-целые обрабатываются как long
s, которые каким-то образом оказались 32-разрядными знаковыми целыми числами даже в 64-разрядных системах и двоичных файлах.
Других решений пока нет …