PHPのインクリメント演算子について

採用はこちら

PHPのインクリメント演算子とは、変数の値を 1増やすための演算子です。

代表的には、次のように ++ を使います。

$count++;

このコードは、基本的には次の処理に近い意味を持ちます。

$count = $count + 1;

または、次のようにも書けます。

$count += 1;

ただし、PHPでは数値だけでなく、文字列・nullbool などに対しても特殊な挙動をする場合があります。

そのため、インクリメント演算子は単純に「1増やすだけ」と覚えるだけでなく、前置・後置の違いや型ごとの挙動も理解しておくことが重要です。

目次

PHPのインクリメント演算子の種類

PHPには、インクリメントとデクリメントを含めて、次の4種類の書き方があります。

書き方名称意味
++$a前置インクリメント$a を1増やしてから、その値を返す
$a++後置インクリメント現在の $a の値を返してから、1増やす
--$a前置デクリメント$a を1減らしてから、その値を返す
$a--後置デクリメント現在の $a の値を返してから、1減らす

インクリメント演算子は ++、デクリメント演算子は -- です。

通常のカウンター処理では ++ を使う機会が多く、たとえばループ処理や件数のカウントなどでよく使われます。

前置インクリメントと後置インクリメントの違い

インクリメント演算子で最も重要なのが、前置と後置の違いです。

前置インクリメント:++$a

前置インクリメントは、変数を先に1増やしてから、その値を式の中で使います。

$a = 5;

echo ++$a;

実行結果は次の通りです。

6

この処理では、まず $a の値が 5 から 6 に増えます。

そのあと、echo によって 6 が表示されます。

つまり、次のような流れです。

$a = 5;
$a = $a + 1;
echo $a;

そのため、++$a は「増やした後の値をすぐ使いたい場合」に向いています。

後置インクリメント:$a++

後置インクリメントは、現在の値を先に使ってから、その後で変数を1増やします。

$a = 5;

echo $a++;

実行結果は次の通りです。

5

一見すると $a++ なのに 6 ではなく 5 が表示されるため、初心者が混乱しやすいポイントです。

ただし、echo の後で $a の値は 6 になっています。

$a = 5;

echo $a++;
echo "\n";
echo $a;

実行結果は次の通りです。

5
6

$a++ は、まず現在の値 5 を返します。

その後で $a6 に増えます。

つまり、後置インクリメントは「今の値を使ったあとで増やしたい場合」に使います。

前置と後置で代入結果が変わる例

前置と後置の違いは、代入と組み合わせると分かりやすくなります。

まず、前置インクリメントの例です。

$a = 5;
$b = ++$a;

echo $a;
echo "\n";
echo $b;

実行結果は次の通りです。

6
6

++$a は、先に $a6 にしてから、その値を $b に代入します。

そのため、$a$b6 になります。

次に、後置インクリメントの例です。

$a = 5;
$b = $a++;

echo $a;
echo "\n";
echo $b;

実行結果は次の通りです。

6
5

$a++ は、まず現在の値 5$b に代入します。

その後で $a6 になります。

整理すると、次のようになります。

$a = 5;
$b = ++$a;

// $a は 6
// $b は 6
$a = 5;
$b = $a++;

// $a は 6
// $b は 5

この違いを理解しておくと、インクリメント演算子を式の中で使ったときの挙動が分かりやすくなります。

デクリメント演算子とは

インクリメントが「1増やす」演算子であるのに対して、デクリメントは「1減らす」演算子です。

デクリメントには -- を使います。

$a = 10;
$a--;

echo $a;

実行結果は次の通りです。

9

インクリメントと同じように、デクリメントにも前置と後置があります。

前置デクリメント:--$a

前置デクリメントは、先に値を1減らしてから、その値を返します。

$a = 5;

echo --$a;

実行結果は次の通りです。

4

後置デクリメント:$a--

後置デクリメントは、現在の値を先に返してから、その後で値を1減らします。

$a = 5;

echo $a--;
echo "\n";
echo $a;

実行結果は次の通りです。

5
4

$a-- は、まず 5 を返します。

その後で $a4 になります。

for文で使うインクリメント演算子

インクリメント演算子は、for 文でよく使われます。

for ($i = 0; $i < 5; $i++) {
    echo $i . "\n";
}

実行結果は次の通りです。

0
1
2
3
4

このコードでは、ループが1回終わるたびに $i++ が実行され、$i の値が1ずつ増えていきます。

処理の流れは次のようになります。

$i = 0;       // 初期値
$i < 5;       // 条件判定
処理を実行
$i++;         // 1増やす

for 文の3つ目の式では、$i++++$i の違いが問題になることはほとんどありません。

たとえば、次のように書いても同じ結果になります。

for ($i = 0; $i < 5; ++$i) {
    echo $i . "\n";
}

実行結果は同じです。

0
1
2
3
4

単純なループカウンターとして使う場合は、慣習的に $i++ がよく使われます。

数値に対するインクリメント

整数に対するインクリメントは、最も基本的な使い方です。

$count = 10;
$count++;

echo $count;

実行結果は次の通りです。

11

小数に対してもインクリメントできます。

$price = 10.5;
$price++;

echo $price;

実行結果は次の通りです。

11.5

この場合も、単純に 1 が加算されます。

数値文字列に対するインクリメント

PHPでは、文字列であっても中身が数値として解釈できる場合、インクリメントによって数値として扱われます。

$a = "10";
$a++;

var_dump($a);

実行結果は次の通りです。

int(11)

"10" は文字列ですが、数値文字列として解釈されるため、インクリメント後は整数の 11 になります。

ただし、フォーム入力、CSV、APIレスポンスなどから取得した値は、見た目が数字でも文字列として扱われることが多いです。

そのため、実務では数値として扱いたい値は、明示的にキャストしてからインクリメントする方が安全です。

$count = (int) $_POST['count'];
$count++;

このように書くことで、「この値は数値として扱う」という意図が明確になります。

文字列に対するインクリメント

PHPには、英数字の文字列をインクリメントできる特殊な挙動があります。

たとえば、次のように書けます。

$a = "a";
$a++;

echo $a;

実行結果は次の通りです。

b

"a" をインクリメントすると "b" になります。

また、"z" をインクリメントすると "aa" になります。

$a = "z";
$a++;

echo $a;

実行結果は次の通りです。

aa

大文字でも同様です。

$a = "Z";
$a++;

echo $a;

実行結果は次の通りです。

AA

この挙動は、Excelの列名のような増え方に近いです。

A
B
C
...
Z
AA
AB
AC

ただし、新しいコードでは、文字列のインクリメントに ++ を使うのは避けた方がよいです。

PHP 8.3以降では、非数値文字列のインクリメントについて str_increment() の使用が推奨されています。

$code = "Z";
$code = str_increment($code);

echo $code;

実行結果は次の通りです。

AA

文字列を連番コードとして扱う場合は、$code++ よりも str_increment($code) を使った方が、意図が明確で保守しやすいコードになります。

bool型に対するインクリメント

truefalse などの bool 型に対して、インクリメント演算子を使うべきではありません。

$flag = true;
$flag++;

var_dump($flag);

bool に対するインクリメントやデクリメントは、実務では意図が分かりにくいコードになります。

たとえば、フラグが true の場合に件数を増やしたいなら、bool そのものをインクリメントするのではなく、別の数値変数を用意するべきです。

$flag = true;
$count = 0;

if ($flag) {
    $count++;
}

このように書けば、「条件を満たした場合にカウントを増やす」という意図が明確になります。

nullに対するインクリメント

PHPでは、null に対してインクリメントすると、通常は 1 になります。

$a = null;
$a++;

var_dump($a);

実行結果は次の通りです。

int(1)

ただし、実務では null++ のようなコードは避けた方がよいです。

なぜなら、「未設定値を0として扱いたい」のか、「値がないなら処理したくない」のかがコードから分かりにくいからです。

未設定値を0として扱いたいなら、次のように明示します。

$a = $a ?? 0;
$a++;

一方、値が null でない場合だけインクリメントしたいなら、次のように書きます。

if ($a !== null) {
    $a++;
}

また、null に対するデクリメントには注意が必要です。

$a = null;
$a--;

PHP 8.3以降では、null に対するデクリメントは警告の対象になります。

そのため、null の可能性がある値を扱う場合は、事前に値を確認するか、明示的に初期値を設定することが重要です。

配列やオブジェクトに対するインクリメント

通常の配列やオブジェクトに対して、インクリメント演算子を使うべきではありません。

$array = [];
$array++;
$obj = new stdClass();
$obj++;

このようなコードは、何をしたいのかが分かりにくく、実務では避けるべきです。

配列の要素数を増やしたいなら、インクリメントではなく要素を追加します。

$items = [];
$items[] = 'apple';

件数を数えたいなら、別のカウント用変数を使います。

$count = 0;

foreach ($items as $item) {
    $count++;
}

単純に配列の件数を取得したいだけなら、count() を使うのが自然です。

$count = count($items);

一部の内部オブジェクトでは演算がサポートされている場合もありますが、通常のWebアプリケーション開発では、配列や一般的なオブジェクトに ++ を使う場面はほとんどありません。

インクリメント演算子を使う実務例

インクリメント演算子は、カウント処理でよく使われます。

成功件数と失敗件数を数える例

$successCount = 0;
$errorCount = 0;

foreach ($results as $result) {
    if ($result['success']) {
        $successCount++;
    } else {
        $errorCount++;
    }
}

このコードでは、処理が成功した場合は $successCount を1増やし、失敗した場合は $errorCount を1増やしています。

このようなカウンター処理では、インクリメント演算子を使うと自然で読みやすいコードになります。

ページ番号を進める例

$page = 1;

$page++;

このコードでは、ページ番号を1つ進めています。

ページネーションやステップ処理など、現在の番号を次に進めたい場合にもインクリメント演算子は便利です。

リトライ回数を数える例

$retryCount = 0;

while ($retryCount < 3) {
    // 処理

    $retryCount++;
}

このコードでは、処理を実行するたびにリトライ回数を1増やしています。

$retryCount++ によって回数を管理することで、最大リトライ回数を超えないように制御できます。

複雑な式の中で使う場合の注意点

インクリメント演算子は便利ですが、複雑な式の中で使いすぎるとコードが読みにくくなります。

たとえば、次のようなコードです。

$a = 1;
$b = $a++ + ++$a;

echo $a;
echo "\n";
echo $b;

このコードは動作しますが、読む人は「どのタイミングで $a が増えるのか」を追わなければなりません。

チーム開発や保守性を考えると、このような書き方は避けた方がよいです。

より分かりやすく書くなら、処理を分けます。

$a = 1;

$first = $a;
$a++;

$a++;
$second = $a;

$b = $first + $second;

処理を分けることで、値がいつ増えるのかが明確になります。

比較式の中で使う場合の注意点

インクリメント演算子を比較式の中で使うと、前置と後置の違いによって結果が変わります。

$i = 0;

if ($i++ === 0) {
    echo 'OK';
}

実行結果は次の通りです。

OK

$i++ は、比較時にはまだ 0 を返します。

その後で $i1 になります。

一方、前置インクリメントを使うと結果が変わります。

$i = 0;

if (++$i === 0) {
    echo 'OK';
} else {
    echo 'NG';
}

実行結果は次の通りです。

NG

++$i は、比較する前に $i1 にします。

そのため、1 === 0 となり、条件は false になります。

このような書き方は短く書けますが、読み間違いの原因にもなります。

実務では、次のように分けて書いた方が分かりやすいです。

$i = 0;

if ($i === 0) {
    echo 'OK';
}

$i++;

関数の引数で使う場合の注意点

関数の引数にインクリメント演算子を使う場合も、前置と後置の違いに注意が必要です。

function show($value) {
    echo $value;
}

$count = 10;

show($count++);
echo "\n";
echo $count;

実行結果は次の通りです。

10
11

$count++ は、関数に渡される時点では 10 を返します。

その後で $count11 になります。

前置インクリメントの場合は、次のようになります。

function show($value) {
    echo $value;
}

$count = 10;

show(++$count);
echo "\n";
echo $count;

実行結果は次の通りです。

11
11

++$count は、関数に渡される前に $count11 にします。

そのため、関数には 11 が渡されます。

ただし、関数の引数でインクリメントを使うと、処理の順番が分かりにくくなる場合があります。

読みやすさを重視するなら、次のように分けて書くのがおすすめです。

$count++;
show($count);

または、現在の値を渡してから増やしたいなら、次のように書きます。

show($count);
$count++;

$i++++$i はどちらを使うべきか

単独で使う場合、$i++++$i の結果は同じです。

$i = 1;
$i++;

echo $i;

実行結果は次の通りです。

2

次のように書いても同じです。

$i = 1;
++$i;

echo $i;

実行結果は次の通りです。

2

違いが出るのは、式の中で値として使う場合です。

$i = 1;

echo $i++;

実行結果は次の通りです。

1
$i = 1;

echo ++$i;

実行結果は次の通りです。

2

実務では、次のように使い分けるとよいです。

場面おすすめ
単純に1増やすだけ$i++ または ++$i
for文のループカウンター$i++ が一般的
増やした後の値をすぐ使う++$i
現在の値を使ってから増やす$i++
複雑な式の中使わずに処理を分ける

単純なカウント処理では、$i++ がよく使われます。

ただし、値を返すタイミングが重要な場面では、前置と後置の違いを意識する必要があります。

インクリメント演算子を使うときの注意点

PHPのインクリメント演算子を使うときは、次の点に注意しましょう。

数値に対して使うのが基本

インクリメント演算子は、基本的には整数や小数などの数値に対して使うのが安全です。

$count++;
$page++;
$retryCount++;

このようなカウンター系の変数に使うと、意図が分かりやすくなります。

文字列には安易に使わない

PHPでは文字列にもインクリメントを使える場合がありますが、新しいコードでは安易に使わない方がよいです。

$code = "Z";
$code++;

このコードは動作しますが、今後の保守性を考えると、次のように str_increment() を使う方が望ましいです。

$code = "Z";
$code = str_increment($code);

文字列を連番コードとして扱う場合は、PHPのバージョンや入力値の形式にも注意が必要です。

boolやnullには注意する

bool に対してインクリメントを使うのは避けるべきです。

$flag = true;
$flag++;

このようなコードは、意図が分かりにくくなります。

また、null++int(1) になりますが、実務では明示的に初期値を設定した方が安全です。

$value = $value ?? 0;
$value++;

値が存在する場合だけ増やしたいなら、次のように条件分岐します。

if ($value !== null) {
    $value++;
}

複雑な式に混ぜすぎない

次のようなコードは避けた方がよいです。

$total = $a++ + ++$b - $c++;

処理としては書けますが、読む人にとって分かりにくくなります。

実務では、次のように処理を分けた方が安全です。

$a++;
$b++;
$c++;

$total = $a + $b - $c;

ただし、元の処理と完全に同じ意味になるとは限らないため、前置・後置の違いを考慮して分解する必要があります。

重要なのは、短く書くことよりも、処理の意図が明確であることです。

PHPのインクリメント演算子のまとめ

PHPのインクリメント演算子は、変数の値を1増やすための演算子です。

$count++;

基本的には、次の処理に近い意味を持ちます。

$count = $count + 1;

ただし、前置と後置では、値を返すタイミングが異なります。

++$a

は、先に $a を1増やしてから、その値を返します。

$a++

は、現在の $a の値を返してから、1増やします。

たとえば、次のように結果が変わります。

$a = 5;
$b = ++$a;

// $a は 6
// $b は 6
$a = 5;
$b = $a++;

// $a は 6
// $b は 5

インクリメント演算子は、for 文のループカウンターや件数のカウントなどで便利に使えます。

for ($i = 0; $i < 10; $i++) {
    echo $i;
}
$count++;

一方で、文字列・boolnull に対して使う場合は注意が必要です。

特に新しいコードでは、非数値文字列のインクリメントには str_increment() を使う方が望ましいです。

また、複雑な式の中でインクリメント演算子を使うと、前置・後置の違いによって処理が読みにくくなることがあります。

実務では、次のようなシンプルな使い方を基本にするのがおすすめです。

$count++;
$page++;
$retryCount++;

PHPのインクリメント演算子は便利ですが、型ごとの挙動や前置・後置の違いを理解したうえで、読みやすく安全なコードを書くことが大切です。

以上、PHPのインクリメント演算子についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次