Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP strlen()返回负长度?_Php_String_Debugging - Fatal编程技术网

为什么PHP strlen()返回负长度?

为什么PHP strlen()返回负长度?,php,string,debugging,Php,String,Debugging,正在为使用以下方法创建的“大字符串”返回负值: 是否定义了此行为 或者这是一个PHP错误?我想您只是用大字符串溢出了一个int。从手册中: 整数的大小取决于平台,尽管通常的最大值约为20亿(即32位有符号)。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_size确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX确定 所以,如果字符串大小可以适合int,那么就可以了 看起来它实际上是(2GB-1)。这在我的x64机箱上运行良好: $st

正在为使用以下方法创建的“大字符串”返回负值:


是否定义了此行为


或者这是一个PHP错误?

我想您只是用大字符串溢出了一个int。从手册中:

整数的大小取决于平台,尽管通常的最大值约为20亿(即32位有符号)。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_size确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX确定

所以,如果字符串大小可以适合int,那么就可以了

看起来它实际上是(2GB-1)。这在我的x64机箱上运行良好:

$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -1);
echo $str[0];
。。。在这种情况下:

$str = str_repeat('a', 2 * 1024 * 1024 * 1024);
echo $str[0];
您所做的只是没有定义,手册应该更正。我也希望得到警告

有趣的是,这引发了一个致命错误:

$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -2); // 2GB - 2 bytes
$str .= 'b'; // ok
$str .= 'c'; // PHP Fatal error:  String size overflow

更新:


这个问题已得到解决。php.net上的文档已经修复,现在写入“2147483647字节最大值”。

看起来您在32位php上遇到了最大整数值。64位服务器将报告准确的长度。由于strlen返回一个整数值,PHP中的所有整数都是有符号整数,而32位PHP使用32位有符号整数,因此它是隐式定义的。常量PHP_INT_MAX为您提供了上限,因此值“wrapps”并变为负值。请看这里(注意:
当PHP.net声明“note string可以大到2GB”时)php.net/manual/en/language.types.string.php他们的意思是它可以超过2GB吗?–Pacier Jun 6在14:49时
我在64位php上得到了与OP相同的输出。
php_INT_SIZE
==8。@jcsanyi做
echo strlen($str)
将报告与var_dump()相同的负值这里…没有整数溢出,我的PHP_INT_MAX报告9223372036854775807读取。如果字符串有不同的限制,最大整数值是多少并不重要。@Gumbo,strlen()返回一个int。因此您可以从strlen返回int limit。不管字符串有什么限制。@Jk1只能表示最多2^31-1的值。@Gumbo,这是zend server的实现,但并不意味着所有PHP实现都需要遵循这个限制,对吗?我按照您的建议提交了错误报告t:是的,由于某种原因,即使
echo$str[0];
不起作用,字符串仍然占用内存,我们可以对其进行操作(使用trim等)@Pacerier您可能希望将带有字符串连接的测试用例添加到错误报告中,这似乎支持这是一个文档错误的想法。此外,
str\u repeat
可能会抛出与连接时相同的致命错误。至少
str\u pad
确实存在错误。我认为这不仅仅是一个文档错误,它本质上是一个
stru repeat
bug。我认为没有其他函数允许我们创建长度大于2147483647的字符串,是吗?
$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -2); // 2GB - 2 bytes
$str .= 'b'; // ok
$str .= 'c'; // PHP Fatal error:  String size overflow