Menu

PHPの演算子:算術・論理・文字列演算子など一覧

PHPの演算子は値に対して働きます。算術は+、-、*、/、%、**、代入は=、+=、.=、??=、論理は&&、||、!、xor、文字列の結合は.、比較は==、===、<=>、インクリメントは++と--です。各グループを実行できる例で学び、andと&&の優先順位の罠も確認します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

演算子は1つ以上の値を受け取って新しい値を作ります。$a + $bは足し算、$a . $bは文字列の結合、$a && $bは論理積、$a === $bは比較、$i++はインクリメントです。

/は、2つの整数が割り切れる場合を除いてfloatを返します。17 / 5は3.4、10 / 5は整数の2です。整数部分だけが欲しいときはintdiv()を使います。丸めについては数学関数のページで扱っています。

算術演算子

演算子名前例結果
+加算7 + 29
-減算7 - 25
*乗算7 * 214
/除算7 / 23.5
%剰余(余り)7 % 21
**べき乗7 ** 249
-$a符号反転-7-7

剰余は「N個ごと」の処理や偶数・奇数の判定に便利です。結果の符号は左側と同じになり、ゼロで割るとキャッチできるエラーが投げられます。

代入演算子

=は値を格納します。算術演算子と文字列演算子にはそれぞれ、変数をその場で更新する複合形があります。

??=はnull合体演算子の仲間です。変数が未設定かnullのときだけ代入します。

インクリメントとデクリメント:++と--

$i++は現在の値を返してから1を足します。++$iは1を足してから新しい値を返します。違いが表れるのは、同じ式の中で結果を使うときだけです。

この文字のテクニックは、表計算ソフトの列名(A、B、... Z、AA)を作るときによく使われます。

論理演算子:&&、||、!、xor

演算子trueになる条件
$a && $b両方がtrue
$a || $b少なくとも一方がtrue
!$a$aがfalse
$a xor $bちょうど一方だけがtrue
$a and $b, $a or $b&&と||と同じだが優先順位が低い

&&と||は短絡評価を行います。左側だけで結果が決まるときは、右側は評価されません。isset($user) && $user->isAdmin()が安全なのはこのためです。

andと&&:優先順位の罠

andとorは=より結びつきが弱いので、代入の中では値が格納されたあとに適用されます。これは定番のバグです。

この低い優先順位が役に立つ慣用句が1つあります。$file = fopen($path, 'r') or die('Cannot open');のように、代入を先に行わせたい場合です。それ以外では&&と||を使いましょう。

文字列演算子:.と.=

PHPの文字列演算子は2つです。.は2つの文字列を結合し("Grace" . " " . "Hopper")、.=は変数の末尾に追加します($html .= "<li>")。+は文字列を結合しません。"3" + "4"は数値の7で、"3" . "4"は文字列の"34"です。変数展開と引用符については文字列のページで扱っています。

比較と宇宙船演算子<=>

==は型を変換してから比較し、===は型も確認し、<=>は-1、0、1のいずれかを返します。これはソートのコールバックにちょうど必要なものです。詳細とゆるい比較の完全な表は比較演算子のページにあります。

配列演算子

配列に対する+は和集合です。左の配列のキーが優先され、右からは足りないキーだけが追加されます。末尾に追加されると思っていると驚くところです。==は同じキーと値のペアを持つかを確認し、===は順番と型も同じであることを求めます。

リストを別のリストの後ろにつなげるには、array_merge()かスプレッド構文[...$a, ...$b]を使います。

演算子の優先順位

式に複数の演算子が混ざると、PHPは決まった順番で適用します。つまずきやすいものと、PHP 8.3の出力です。

echo 2 + 3 * 4;        // 14: * before +
echo (2 + 3) * 4;      // 20
echo 2 ** 3 ** 2;      // 512: right to left, 2 ** 9
echo -2 ** 2;          // -4: ** before unary minus
echo "Sum: " . 2 + 3;  // Sum: 5, since PHP 8 + runs before .

迷ったら括弧を付けましょう。コストはかからず、次にその行を読む人が表を覚えておく必要もなくなります。

よくある質問

PHPのandと&&の違いは何ですか?

どちらも論理積ですが、andは=より優先順位が低いです。そのため$x = true and false;は$xにtrueを入れ(代入が先に行われる)、$x = true && false;はfalseを入れます。式の中では&&と||を使い、代入ではand/orを使わないようにしましょう。

PHPの%は何をしますか?

%は剰余演算子で、整数の割り算の余りを返します。10 % 3は1です。結果の符号は左側のオペランドと同じです(-7 % 3は-1)。floatにはfmod()を使い、% 0はDivisionByZeroErrorを投げます。

PHPでべき乗を計算するには?

**演算子を使います:2 ** 10は1024です。右結合なので2 ** 3 ** 2は2 ** 9 = 512になり、単項マイナスより強く結びつくので-2 ** 2は-4です。関数pow(2, 10)でも同じことができます。

PHPの$i++と++$iの違いは何ですか?

どちらも$iに1を足します。$i++(後置インクリメント)は古い値を返してから増やし、++$i(前置インクリメント)は先に増やして新しい値を返します。forループの更新部分のように単独で書く場合は違いがありません。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める