PHP Conference Japan 2024

自增/自减运算符

PHP 支持前自增和后自增以及前自减和后自减运算符。这些一元运算符允许将值增加或减少 1。

自增/自减运算符
示例 名称 效果
++$a 前自增 $a 增加 1,然后返回 $a
$a++ 后自增 返回 $a,然后将 $a 增加 1。
--$a 前自减 $a 减少 1,然后返回 $a
$a-- 后自减 返回 $a,然后将 $a 减少 1。

这是一个简单的示例脚本

<?php
echo 'Post-increment:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);

echo
'Pre-increment:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);

echo
'Post-decrement:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);

echo
'Pre-decrement:', 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

PERL 字符串增量特性

警告

此特性从 PHP 8.3.0 开始已软弃用。应改用 str_increment() 函数。

可以在 PHP 中对非 数字字符串 进行自增。字符串必须是字母数字 ASCII 字符串。它会将字母增量到下一个字母,当达到字母 Z 时,增量会进位到左侧的值。例如,$a = 'Z'; $a++;$a 转换为 'AA'

示例 #1 PERL 字符串增量示例

<?php
echo '== Alphabetic strings ==' . PHP_EOL;
$s = 'W';
for (
$n=0; $n<6; $n++) {
echo ++
$s . PHP_EOL;
}
// Alphanumeric strings behave differently
echo '== Alphanumeric strings ==' . 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
警告

如果字母数字字符串可以解释为 数字字符串,则它将被转换为 intfloat。这在看起来像以指数表示法编写的浮点数的字符串中尤其是一个问题。str_increment() 函数不会受到这些隐式类型转换的影响。

示例 #2 字母数字字符串转换为浮点数

<?php
$s
= "5d9";
var_dump(++$s);
var_dump(++$s);
?>

以上示例将输出

string(3) "5e0"
float(6)

这是因为值 "5e0" 被解释为 浮点数,并在递增之前转换为值 5.0

添加注释

用户贡献的注释 1 条注释

hartmut at php dot net
12 年前
请注意

$a="9D9"; var_dump(++$a); => string(3) "9E0"

但从那里开始继续计数

$a="9E0"; var_dump(++$a); => float(10)

这是因为 "9E0" 被解释为浮点数常量 9E0(或 9e0)的字符串表示形式,因此在浮点数上下文中计算为 9 * 10^0 = 9。
To Top