PHPのプログラミングにおいて、論理演算子は条件分岐を制御するために欠かせない要素です。
その中でも「論理和」を表す演算子には「||」と「or」の2種類が存在しますが、これらを同じものとして扱ってしまうと思わぬバグの原因となります。
一見するとどちらも「AまたはB」という条件を評価する点では同じに見えますが、実は演算子の優先順位という重要な違いがあります。
この記事では、PHPにおける「||」と「or」の挙動の違いをコード例とともに詳しく紹介します。
演算子の性質を正しく理解して、意図した通りに動作する堅牢なプログラムを作成しましょう。
PHPの論理演算子「||」と「or」の基本的な役割
PHPにおける論理和演算子は、複数の条件のうち少なくとも1つが真(true)である場合に、全体として真を返す役割を持ちます。
「||」と「or」はどちらもこの論理和の機能を持っていますが、PHPの言語仕様上は異なる演算子として定義されています。
なぜ同じ機能を持つ演算子が2つ用意されているのかを知るためには、演算子の優先順位という概念を理解する必要があります。
優先順位が異なると、式が評価される順番が変わり、最終的な結果に大きな差が生じます。
優先順位の違いがもたらす影響
もっとも重要な違いは、「||」は代入演算子(=)よりも優先順位が高く、「or」は代入演算子よりも優先順位が低いという点です。
プログラミングにおいて、演算の順番は数式の計算順序と同じように厳格に決まっています。
この優先順位を意識せずに「or」を使用すると、代入の結果が期待と異なるものになる可能性が高いです。
具体例で見る「||」と「or」の挙動の差
実際にコードを書いて、どのような違いが生じるのかを確認してみましょう。
以下のコードは、変数に対して論理和の結果を代入するシンプルな例です。
<?php
// || 演算子を使用した場合
$result1 = true || false;
// or 演算子を使用した場合
$result2 = true or false;
var_dump($result1);
var_dump($result2);
?>
bool(true)
bool(true)
この例では、どちらも true と出力されますが、条件を変えると挙動の差が明確になります。
次に、代入演算子と組み合わせた時の動作を比較します。
<?php
// || の場合:代入よりも先に論理和が評価される
$val1 = false || true;
// or の場合:論理和よりも先に代入が実行される
$val2 = false or true;
var_dump($val1);
var_dump($val2);
?>
bool(true)
bool(false)
$val2 の結果が false になっている点に注目してください。
これは、$val2 = false という代入が先に行われ、その後に or true が評価されているためです。
「or」を使った式では、代入が優先されるため、右辺の評価結果が変数に入らないという現象が起きています。
演算子の優先順位表
PHPにおける主要な演算子の優先順位を、高い順に並べると以下のようになります。
| 優先順位 | 演算子 | 説明 |
|---|---|---|
| 1 | ! | 論理否定 |
| 2 | && | 論理積(強) |
| 3 | || | 論理和(強) |
| 4 | = | 代入演算子 |
| 5 | and | 論理積(弱) |
| 6 | or | 論理和(弱) |
この表からわかる通り、|| は代入よりも先に処理されますが、or は代入の後回しにされます。
実務で条件式の結果を変数に格納したい場合は、「||」を使用するのが一般的です。
「or」演算子はいつ使うべきか?
優先順位が低い「or」演算子ですが、決して使ってはいけないわけではありません。
「or」はその優先順位の低さを利用して、制御フローの記述に活用されることがあります。
代表的な使い方は、関数の実行に失敗した際のエラー処理です。
<?php
// 関数の実行に失敗した場合に die() を実行する
$data = file_get_contents('non_existent_file.txt') or die('ファイルが見つかりません');
?>
このコードでは、まず file_get_contents が実行され、その結果が $data に代入されます。
もし代入された値が false 相当であれば、or の右辺である die() が実行される仕組みです。
このように「左辺の処理が失敗した(falseだった)ら右辺を実行する」という「短絡評価」を利用した簡潔なエラーハンドリングにおいて、「or」は非常に有用です。
プログラミングにおけるベストプラクティス
条件分岐の if 文の中で使用する場合は、どちらを使っても基本的には同じ結果が得られます。
しかし、チーム開発やモダンなPHP開発においては、「||」と「&&」に統一するのが推奨されます。
多くのプログラミング言語(JavaScriptやJava、C++など)では論理演算子として「||」が採用されており、他言語の経験者にとっても可読性が高いためです。
また、優先順位による予期せぬ挙動を防ぐためにも、特別な理由がない限りは or よりも || を優先して選ぶべきでしょう。
括弧を用いた可読性の向上
どうしても or を使用しつつ代入も行いたい場合は、括弧 () を使って明示的に優先順位を指定することが可能です。
<?php
// 括弧で囲むことで or を優先させる
$result = (false or true);
var_dump($result);
?>
bool(true)
ただし、このように記述するのであれば、最初から || を使ったほうがコードがシンプルになります。
複雑な条件式を書く際は、演算子の優先順位に頼りすぎず、括弧を適切に使って意図を明確にすることがバグを減らすコツです。
まとめ
PHPの論理演算子「||」と「or」は、機能こそ似ていますが、演算の優先順位が決定的に異なります。
「||」は代入演算子よりも優先され、「or」は代入演算子よりも後に評価されるという違いを常に意識しましょう。
通常の条件判定や変数への代入には || を使い、関数の実行結果に基づくフロー制御には or を使うといった使い分けがポイントです。
演算子の特性を正しく把握することで、意図しない挙動に悩まされることなく、クリーンなPHPコードを記述できるようになります。
