PHP Conference Japan 2024

遞增/遞減運算子

PHP 支援前置和後置的遞增和遞減運算子。這些一元運算子允許將值遞增或遞減一。

遞增/遞減運算子
範例 名稱 效果
++$a 前置遞增 $a 遞增一,然後回傳 $a
$a++ 後置遞增 回傳 $a,然後將 $a 遞增一。
--$a 前置遞減 $a 遞減一,然後回傳 $a
$a-- 後置遞減 回傳 $a,然後將 $a 遞減一。

這是一個簡單的範例腳本

<?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

PERL 字串遞增功能

警告

此功能從 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
警告

如果字母數字字串可以被解釋為數值字串,它將被轉換為 intfloat。當字串看起來像是用指數表示法寫成的浮點數時,這尤其是一個問題。str_increment() 函式不會遇到這些隱式型別轉換的問題。

範例 #2 字母數字字串轉換為浮點數

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

上面的範例會輸出

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

這是因為值 "5e0" 被解釋為 float 並在遞增之前轉換為值 5.0

新增註解

使用者貢獻的註解 1 則註解

71
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