加算子/減算子

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

上の例の出力は以下となります。

後置加算:
int(5)
int(6)
前置加算:
int(6)
int(6)
後置減算:
int(5)
int(4)
前置減算:
int(4)
int(4)
警告

bool 型の値に、加算子や減算子を適用しても何も起こりません。 PHP 8.3.0 以降では、この操作に対して E_WARNING が発生するようになりました。なぜなら、bool 型の値を暗黙のうちに数値型にキャストするように将来変更されるからです。

null 型の値に、減算子を適用しても何も起こりません。 PHP 8.3.0 以降では、この操作に対して E_WARNING が発生するようになりました。なぜなら、null 型の値を暗黙のうちに数値型にキャストするように将来変更されるからです。

数値形式の文字列 でない文字列に対して、減算子を適用しても何も起こりません。 PHP 8.3.0 以降では、この操作に対して E_WARNING が発生するようになりました。なぜなら、こうした操作は TypeError がスローされるように将来変更されるからです。

注意:

加算や減算の振る舞いをオーバーロードする機能をサポートしている内部オブジェクトも、インクリメントしたり、デクリメントしたりできます。このような内部オブジェクトの例としては、GMP が挙げられます。 

Perl 風の、文字列をインクリメントする機能

警告

この機能は、PHP 8.3.0 以降は soft-deprecated 扱い (E_DEPRECATED は発生しないものの、新しいコードではこの機能を使うべきではない) になっています。 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;
}
?>

上の例の出力は以下となります。

== アルファベットからなる文字列 ==
X
Y
Z
AA
AB
AC
== 英数字からなる文字列 ==
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 にキャストされるためです。