编程

PHP 8.1: 显式八进制数字表示法

190 2023-08-20 13:06:00

PHP 支持多种数字系统,包括默认的十进制数字、二进制数字、八进制数字及十六进制数。

十进制之外的数字系统都有它们自己的前缀:

  • 十六进制 0x 前缀: e.g. 0x11 = 17
  • 二进制 0b 前缀: e.g. 0b11 = 3
  • 八进制 0 前缀: e.g. 011 = 9

PHP 8.1 之后,八进制也支持 0o(零及字母o)前缀,这意味着八进制字面量可以更明显及可读。也支持 0O (大写字母O)。 

许多编程语法使用 0 作为八进制字面量的前缀,比如 PHP。不过,许多语言也支持显式 0o 并推荐使用 0o

 

echo 0xff; // 255
echo 0b111; // 7
echo 77; // 77
echo 077; // 63
echo 0o77; // 63, In PHP 8.1
echo 0O77; // 63, In PHP 8.1
077 === 63; // true
077 === 0o77; // true
077 === 0O77; // true

此外,以 0o/0o为前缀的数字文字也支持下划线数字分隔符:

echo 0o7716_1412; // 16573194

0 前缀没有修改

现有的 0 前缀没有被弃用,还和以前一样。

除了现有的 0 前缀,还额外支持 0o/0O 前缀。

数字字符串没有改变

数字字符串,如包含数字的字符串,不受此影响。"0o16" (作为字符串) 不会被解释为数字,也不会在 is_numeric 函数中返回 true

echo "016"; // "016"
is_numeric("0o77"); // false
is_numeric("0b11"); // false
is_numeric("0x16"); // false

注意 "016"is_numeric 中返回 true ,这也没改变:

is_numeric("016"); // true

向后兼容性影响

0o0O 前缀是新的前缀,在旧版本 PHP 中不支持。在旧版中使用会导致语法错误:

$value = 0o77;
Parse error: syntax error, unexpected identifier "o77" in ... on line ...