strlen($str)
đang trở lại giá trị âm cho một "chuỗi khổng lồ" được tạo bằng str_repeat
:Tại sao PHP strlen() trả về độ dài âm?
<?php
error_reporting(E_STRICT|E_ALL);
echo phpversion(); // 5.3.26
echo PHP_INT_MAX; // 9223372036854775807
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);
$gb = 1024 * 1024 * 1024;
$str = str_repeat('a', 2 * $gb);
echo strlen($str); // gives int(-2147483648)
echo $str[0]; // Notice: Uninitialized string offset: 0
$str2 = str_repeat('a', 4 * $gb);
echo strlen($str2); // gives int(0)
$str3 = str_repeat('a', 123 + 4 * $gb);
echo strlen($str3); // gives int(123)
$str4 = str_repeat('a', 6 * $gb); // starts to wrap again...
echo strlen($str4); // gives int(-2147483648)
echo $str4[0]; // Notice: Uninitialized string offset: 0
$str5 = str_repeat('a', 123 + 8 * $gb);
echo strlen($str5); // gives int(123)
?>
là hành vi này được xác định?
Hoặc đây có phải là lỗi PHP không?
Có vẻ như bạn đã chạy vào giá trị số nguyên tối đa trên 32 bit PHP. Một máy chủ 64bit sẽ báo cáo độ dài chính xác. – ceejayoz
Khi strlen trả về một giá trị số nguyên, và tất cả các số nguyên trong PHP là các số nguyên đã ký, và PHP 32 bit sử dụng các số nguyên đã ký 32 bit, thì nó được định nghĩa ngầm định. PHP_INT_MAX không đổi cung cấp cho bạn giới hạn trên, trong đó giá trị "kết thúc tốt đẹp" và đi tiêu cực –
Báo cáo PHP_INT_MAX của tôi 9223372036854775807 ... – Pacerier