PHP 入門

PHP 演算子アドバンス

インクリメント(Increment)およびデクリメント(Decrement)演算子は、バリアブル(変数)の現在の値を 1 増やす、あるいは 1 減らすための非常に簡潔な記法を提供します。

PHP において、これらの演算子は「プレフィックス(前置)インクリメント/デクリメント」と「ポストフィックス(後置)インクリメント/デクリメント」という 2 つの形式で存在します。

1. プレフィックス(前置)とポストフィックス(後置)の違い

これら 2 つの唯一の違いは、エクスプレッション(式)の中でバリアブルが評価されるタイミングに対して、値の修正がどの時点で行われるかという点にあります。

  • プレフィックスインクリメント (++$a): 先にバリアブルの値が 1 加算され、その後に修正後の値が返されます。
  • ポストフィックスインクリメント ($a++): 先にバリアブルの元の値を返し、その後にバリアブルに 1 加算されます。

同じロジックがデクリメント演算子(--$a および $a--)にも完全に適用されます。

<?php
$count = 10;
// ポストフィックス(後置)インクリメント:先に 10 を返し、その後に $count の値を 11 に設定
echo $count++; // 出力 10
echo $count;   // 出力 11

$score = 5;
// プレフィックス(前置)インクリメント:先に $score の値を 6 に設定し、その後に 6 を返す
echo ++$score; // 出力 6
echo $score;   // 出力 6
?>

1.1 実行フローの比較

直感的に理解できるよう、低レイヤーでの実行フローを以下のように分解して比較します。

ステッププレフィックス操作 (例: ++$a)ポストフィックス操作 (例: $a++)
第1ステップバリアブルの値を修正(+1 / -1)元の値を一時領域(メモリ)に保存
第2ステップ新しい値を返し、式の中で計算に利用バリアブルの値を修正(+1 / -1)
第3ステップ(なし)保存されていた元の値を返し、式の中で計算に利用

初心者向けの回避ガイド:

これらの演算子の誤った使用は、容易に「オフバイワンエラー(off-by-one errors)」を引き起こします。演算子が独立したステートメントとして使用される場合(例:単一行で $i++; と記述)、プレフィックスとポストフィックスに機能的な違いはありません。しかし、バリアブルが複雑なエクスプレッションや代入操作の一部として使用される場合、この挙動の差異が極めて重要になります。

2. 文字列演算子とコンカチネーション(結合)

PHP は、ストリング(文字列)を処理するために 2 つの主要な演算子を提供しています。それがコンカチネーション演算子(.)結合代入演算子(.=)です。

ピリオド(.)は、2 つ以上のストリングを連結して 1 つの完全なストリングを作成するために使用されます。

<?php
$firstName = "Jane";
$lastName = "Doe";

// 標準的なコンカチネーション(結合)
$fullName = $firstName . " " . $lastName; // 結果は "Jane Doe"

// 結合代入:既存のバリアブルの末尾に新しいデータを追加
$message = "Hello, ";
$message .= $firstName; // $message は "Hello, Jane" に変化
$message .= "!";        // $message は "Hello, Jane!" に変化
?>

3. PHP における特殊な挙動(振る舞いの差異)

一部の強タイプ言語とは異なり、PHP でインクリメント演算子を非数値タイプに適用すると、独自の特殊な挙動を示します。

  • ブーリアン(Boolean): true をインクリメントしても、結果は true のままです(2 にはなりません)。また、ブーリアンをデクリメントしても何も効果はありません。
  • NULL: null をインクリメントした結果は 1 になります(PHP はこの場合、null を 0 として扱います)。デクリメントした場合は何も効果はありません。
  • ストリング(Strings): PHP はアルファベットと数字のみを含むストリングのインクリメントをサポートしていますが、デクリメントはサポートしていません。文字はアルファベット順に繰り上がります。
<?php
$str = "A";
$str++; // $str は "B" になります

$str = "Z";
$str++; // $str は "AA" になります(Excel の列名インクリメント規則に似ています)
?>