请注意
$a="9D9"; var_dump(++$a); => string(3) "9E0"
但从那里继续计数
$a="9E0"; var_dump(++$a); => float(10)
这是因为 "9E0" 被解释为浮点常量 9E0(或 9e0)的字符串表示形式,因此在浮点上下文中计算为 9 * 10^0 = 9
PHP 支持前置和后置递增和递减运算符。这些一元运算符允许将值递增或递减 1。
示例 | 名称 | 效果 |
---|---|---|
++$a | 前置递增 | 将 $a 递增 1,然后返回 $a。 |
$a++ | 后置递增 | 返回 $a,然后将 $a 递增 1。 |
--$a | 前置递减 | 将 $a 递减 1,然后返回 $a。 |
$a-- | 后置递减 | 返回 $a,然后将 $a 递减 1。 |
这是一个简单的示例脚本
<?php
echo '后置递增:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);
echo '前置递增:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);
echo '后置递减:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);
echo '前置递减:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
?>
上面的示例将输出
Post-increment: int(5) int(6) Pre-increment: int(6) int(6) Post-decrement: int(5) int(4) Pre-decrement: int(4) int(4)
递增和递减运算符对 bool 类型的变量没有影响。从 PHP 8.3.0 开始会发出一个 E_WARNING
,因为将来这将隐式将值转换为 int 类型。
递减运算符对 null 类型的变量没有影响。从 PHP 8.3.0 开始会发出一个 E_WARNING
,因为将来这将隐式将值转换为 int 类型。
递减运算符对非 数字字符串 没有影响。从 PHP 8.3.0 开始会发出一个 E_WARNING
,因为将来会抛出一个 TypeError。
注意:
支持重载加法和/或减法的内部对象也可以进行递增和/或递减操作。一个这样的内部对象是 GMP。
从 PHP 8.3.0 开始,此特性已软弃用。建议使用 str_increment() 函数。
在 PHP 中可以递增非 数字字符串。该字符串必须是字母数字 ASCII 字符串。它会将字母递增到下一个字母,当到达字母 Z
时,递增会被传递到左侧的值。例如,$a = 'Z'; $a++;
会将 $a 变成 'AA'
。
示例 #1 PERL 字符串递增示例
<?php
echo '== 字母字符串 ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// 字母数字字符串的行为不同
echo '== 字母数字字符串 ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
?>
上面的示例将输出
== Alphabetic strings == X Y Z AA AB AC == Alphanumeric strings == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14
如果字母数字字符串可以解释为 数字字符串,它将被转换为 int 或 float。这在看起来像以科学计数法表示的浮点数的字符串中尤其是一个问题。 str_increment() 函数不会受到这些隐式类型转换的影响。
示例 #2 字母数字字符串转换为 float
<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
?>
上面的示例将输出
string(3) "5e0" float(6)
这是因为值 "5e0"
被解释为 float 类型,并在递增之前转换为值 5.0
。
请注意
$a="9D9"; var_dump(++$a); => string(3) "9E0"
但从那里继续计数
$a="9E0"; var_dump(++$a); => float(10)
这是因为 "9E0" 被解释为浮点常量 9E0(或 9e0)的字符串表示形式,因此在浮点上下文中计算为 9 * 10^0 = 9