請注意
$a="9D9"; var_dump(++$a); => string(3) "9E0"
但從那裡繼續計數
$a="9E0"; var_dump(++$a); => float(10)
這是因為 "9E0" 被解讀為浮點常數 9E0 (或 9e0) 的字串表示形式,因此會計算為 9 * 10^0 = 9 (在浮點數上下文中)
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。
此功能從 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 字母數字字串轉換為浮點數
<?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 (在浮點數上下文中)