演算子は1つ以上の値を受け取って新しい値を作ります。$a + $bは足し算、$a . $bは文字列の結合、$a && $bは論理積、$a === $bは比較、$i++はインクリメントです。
/は、2つの整数が割り切れる場合を除いてfloatを返します。17 / 5は3.4、10 / 5は整数の2です。整数部分だけが欲しいときはintdiv()を使います。丸めについては数学関数のページで扱っています。
算術演算子
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
+ | 加算 | 7 + 2 | 9 |
- | 減算 | 7 - 2 | 5 |
* | 乗算 | 7 * 2 | 14 |
/ | 除算 | 7 / 2 | 3.5 |
% | 剰余(余り) | 7 % 2 | 1 |
** | べき乗 | 7 ** 2 | 49 |
-$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ループの更新部分のように単独で書く場合は違いがありません。