MENU

【PHP】演算子の種類と使い方を解説|Webの基礎

PHPの演算子の種類と使い方を解説|Webの基礎
目次

はじめに

前回の記事では、文字列・整数・浮動小数点数・真偽値・NULLといったデータ型と、型が自動で変換される仕組みを解説しました。

今回は、値の計算や比較に使う演算子について解説します。前回予告した==と===の違いも、この記事で詳しく取り上げます。

演算子は、次回以降のif文や繰り返し処理の条件を書くときにも必ず使う、PHPの土台となる知識です。

演算子とは?

演算子とは、+や>のように、値に対して計算や比較などの処理を行う記号のことです。演算子によって処理される値をオペランドと呼びます。

<?php
    $total = 100 + 200; // +が演算子、100と200がオペランド

PHPの演算子は、役割ごとに次のように分類できます。

PHPの演算子の種類別早見表(算術・文字列連結・代入・比較・論理・その他)

以下、種類ごとに順番に見ていきます。

算術演算子(+・-・*・/・%・**)

算術演算子は、四則演算などの計算を行う演算子です。

演算子意味例結果
+足し算10 + 313
-引き算10 - 37
*掛け算10 * 330
/割り算10 / 33.3333333333333
%割り算の余り10 % 31
**べき乗2 ** 38
<?php
    $price = 1200;
    $quantity = 3;

    echo $price * $quantity; // 3600
    echo 10 % 3;             // 1

前回の記事で解説したとおり、/で割り切れない割り算をすると、結果は浮動小数点数(float)になります。割り算の結果を整数で受け取りたい場合は、intdiv()関数を使うと小数点以下を切り捨てた整数が得られます。

<?php
    var_dump(10 / 5);        // int(2)
    var_dump(10 / 3);        // float(3.3333333333333335)
    var_dump(intdiv(10, 3)); // int(3)

VBAでは余りを求めるのにMod演算子、整数の割り算に\演算子を使いました。PHPでは余りが%、整数の割り算はintdiv()関数になります。

文字列連結演算子(.)

PHPで文字列どうしをつなげるときは、ピリオド(.)を使います。これまでの記事でも何度か登場した書き方です。

<?php
    $name = "田中";
    echo "こんにちは、" . $name . "さん"; // こんにちは、田中さん

JavaScriptでは+で文字列を連結できましたが、PHPの+は常に数値の足し算です。"10" + "20"は文字列の連結ではなく30になり、連結したい場合は"10" . "20"(結果は"1020")と書きます。

代入演算子とインクリメント・デクリメント

代入演算子(=・+=・.= など)

=は、右辺の値を左辺の変数に代入する演算子です。さらに、計算と代入をまとめて書ける複合代入演算子も用意されています。

演算子例同じ意味の書き方
+=$x += 5;$x = $x + 5;
-=$x -= 3;$x = $x - 3;
*=$x *= 2;$x = $x * 2;
/=$x /= 4;$x = $x / 4;
%=$x %= 4;$x = $x % 4;
.=$s .= "円";$s = $s . "円";
<?php
    $total = 1000;
    $total += 500;
    echo $total; // 1500

    $message = "PHP";
    $message .= "入門";
    echo $message; // PHP入門

.=は、文字列の後ろに少しずつ文字を追加していくときによく使います。

インクリメント・デクリメント(++・–)

++は変数の値を1増やし、--は1減らす演算子です。PHP-09で扱う繰り返し処理(for文)でよく使います。

<?php
    $count = 5;
    $count++;
    echo $count; // 6

    $count--;
    echo $count; // 5

++は変数の前にも後ろにも書けます。echo $i++;(後置)は表示してから1増やし、echo ++$i;(前置)は1増やしてから表示します。単独の行で使う場合はどちらも同じ結果になります。

比較演算子(== と === の違いに注意)

比較演算子は、2つの値を比べて、結果をtrue(正しい)またはfalse(正しくない)で返す演算子です。

演算子意味例結果
==等しい(値のみ比較)"10" == 10true
===等しい(値と型を比較)"10" === 10false
!=等しくない(値のみ比較)"10" != 10false
!==等しくない(値と型を比較)"10" !== 10true
>より大きい5 > 3true
>=以上5 >= 5true
<より小さい3 < 2false
<=以下3 <= 3true

== と === の違い

==は、型が違う場合に型を自動変換してから値を比較します。一方===は、値と型の両方が一致した場合だけtrueを返します。

<?php
    var_dump("10" == 10);  // bool(true)  文字列"10"を数値10に変換して比較
    var_dump("10" === 10); // bool(false) 文字列と整数で型が違う

==は便利な反面、次のように直感と違う結果になることがあります。

==と===の比較結果を並べた表。"10"と10、"1"と"01"、nullとfalseなどの組み合わせでの違いを示した図

特に"1" == "01"がtrueになる点は要注意です。どちらも文字列ですが、数値として解釈できる文字列どうしは数値として比較されるため、等しいと判定されます。

比較は基本的に===を使うのがおすすめです。型の違いによる思わぬ一致を防げるため、バグの原因を減らせます。フォームから届いた文字列を数値と比較したい場合は、前回の記事で解説したキャスト((int)など)で型をそろえてから===で比較します。

PHP 8で変わった比較の挙動

PHP 8では、数値と数値ではない文字列を==で比べたときの挙動が変わりました。

<?php
    var_dump("abc" == 0); // PHP 8:bool(false)/PHP 7まで:bool(true)
    var_dump(0 == "");    // PHP 8:bool(false)/PHP 7まで:bool(true)

PHP 7までは"abc"を数値の0に変換してから比較していたため、trueになっていました。PHP 8からは、数値ではない文字列との比較では数値のほうを文字列に変換して比べるようになり、より直感に近い結果になっています。古い記事やサンプルコードを参考にするときは、PHPのバージョンの違いに注意してください。

PHPには<=>という比較演算子(通称:宇宙船演算子)もあります。左が小さければ-1、等しければ0、左が大きければ1を返す演算子で、PHP-12で扱う配列の並べ替えなどで使います。

論理演算子(&&・||・!)

論理演算子は、複数の条件を組み合わせたり、条件を反転させたりする演算子です。

演算子意味例結果
&&かつ(両方trueならtrue)true && falsefalse
\|\|または(どちらかがtrueならtrue)true \|\| falsetrue
!否定(trueとfalseを反転)!truefalse
<?php
    $age = 25;

    // 20歳以上かつ30歳未満か
    var_dump($age >= 20 && $age < 30); // bool(true)

比較演算子と論理演算子を組み合わせることで、「20代かどうか」のような範囲の条件を表せます。

PHPにはand・orという論理演算子もありますが、&&・||とは優先順位が異なります。たとえば$result = false or true;と書くと、=のほうが先に処理されるため、$resultにはfalseが入ります。混乱を避けるため、論理演算子は&&・||を使うのがおすすめです。

三項演算子とNULL合体演算子(??)

三項演算子(条件 ? 値1 : 値2)

三項演算子は、条件がtrueなら値1、falseなら値2を返す演算子です。条件によって値を出し分けたいときに、1行で書けます。

<?php
    $score = 75;
    echo $score >= 60 ? "合格" : "不合格"; // 合格

条件分岐の基本となるif文は、次回PHP-07で解説します。三項演算子は、if文で書く処理のうち「値を1つ選ぶだけ」のシンプルなケースを短く書ける方法として覚えておくと便利です。

NULL合体演算子(??)

??は、左側の値がNULLまたは未定義なら右側の値を返す演算子です。値が入っていないときの「既定値」を決めるのに使います。

<?php
    $nickname = null;
    echo $nickname ?? "ゲスト"; // ゲスト

    echo $undefinedVar ?? "未設定"; // 未設定(未定義の変数でも警告が出ない)

??は、変数が未定義でもUndefined variableの警告を出さずに既定値を返してくれます。第2弾で扱うフォームの値の受け取りなど、「値が送られてこないかもしれない」場面でよく使われます。

??が既定値に切り替えるのは、値がNULLか未定義のときだけです。空の文字列""や0の場合はそのまま返されます。空文字も既定値に置き換えたい場合は、三項演算子を省略した?:を使い、$name ?: "ゲスト"と書きます。

実務サンプル(会員割引と送料無料判定で合計金額を計算する)

ここまで紹介した演算子をまとめて使い、ショッピングカートの合計金額を計算してみましょう。会員なら10%割引し、割引後の金額が3,000円以上なら送料無料にします。

小計の計算から会員割引、送料判定、合計金額までの計算の流れを示したフロー図
<?php
    // 商品情報
    $priceA = 1200;
    $quantityA = 2;
    $priceB = 800;
    $quantityB = 1;

    // 会員情報・クーポン(未入力の場合はnull)
    $isMember = true;
    $couponCode = null;

    $freeShippingLine = 3000; // 送料無料になる金額
    $shippingFee = 500;       // 通常の送料
    $discountRate = 0.1;      // 会員割引率(10%)

    // ① 算術演算子で小計を計算
    $subtotal = $priceA * $quantityA + $priceB * $quantityB;

    // ② 三項演算子で会員割引額を決める
    $discount = $isMember ? (int)($subtotal * $discountRate) : 0;
    $afterDiscount = $subtotal - $discount;

    // ③ 比較演算子と三項演算子で送料を判定
    $shipping = $afterDiscount >= $freeShippingLine ? 0 : $shippingFee;
    $total = $afterDiscount + $shipping;

    // ④ 論理演算子で「あと何円で送料無料か」の案内を出し分け
    $remaining = $freeShippingLine - $afterDiscount;
    $message = $remaining > 0 && $shipping > 0
        ? "送料無料まであと{$remaining}円です"
        : "送料無料です";

    // ⑤ ??でクーポン未入力時の表示を決める
    $couponText = $couponCode ?? "なし";

    echo "小計:{$subtotal}円<br>";
    echo "会員割引:-{$discount}円<br>";
    echo "送料:{$shipping}円<br>";
    echo "合計:{$total}円<br>";
    echo "クーポン:{$couponText}<br>";
    echo $message;

ブラウザでの表示結果は次のようになります。

小計:3200円
会員割引:-320円
送料:500円
合計:3380円
クーポン:なし
送料無料まであと120円です

小計は3,200円ですが、会員割引で2,880円になったため、送料無料のラインである3,000円を下回り、送料500円がかかっています。$isMemberをfalseに変えると、割引がなくなって小計3,200円のまま送料無料になり、合計金額が逆に安くなる(3,200円)ことも確認できます。このように、演算子を組み合わせると、条件によって変わる金額計算を少ない行数で表現できます。

<br>は、ブラウザで改行して表示するためのHTMLタグです。PHPのechoで出力した文字列はHTMLとしてブラウザに渡されるため、改行したい位置に<br>を含めています。

よくある質問・エラー対処

Q. 文字列を+でつなげたら数値になってしまいました

→ PHPの+は常に足し算として扱われます。文字列を連結したい場合はピリオド(.)を使ってください。数値として解釈できない文字列を+で計算すると、Unsupported operand typesというエラーになります。


Q. ==で比較したら、違うはずの値がtrueになりました

→ ==は型を自動変換してから比較するため、"1" == "01"のように見た目が違ってもtrueになることがあります。型まで一致しているかを確かめたい場合は===を使ってください。


Q. Division by zeroというエラーが出ます

→ 0で割り算(/・intdiv())をしたときに表示されるエラー(DivisionByZeroError)です。%で0を指定した場合はModulo by zeroと表示されます。割る数が0になっていないか、変数の中身をvar_dump()で確認してください。


Q. ??と三項演算子はどう使い分ければいいですか?

→ 「値がNULLまたは未定義なら既定値を使う」だけなら??、それ以外の条件(数値の大小など)で値を出し分けたい場合は三項演算子を使います。

おわりに(まとめ)

まとめ

演算子は、計算・比較・条件の組み立てに欠かせない基本要素です。

  • ✅ 算術演算子で計算し、整数の割り算にはintdiv()を使う
  • ✅ 文字列の連結は+ではなくピリオド(.)を使う
  • ✅ +=や.=などの複合代入演算子で、計算と代入をまとめて書ける
  • ✅ ==は型を変換して比較、===は型まで含めて比較する(基本は===がおすすめ)
  • ✅ 論理演算子は&&・||・!を使い、andやorとの優先順位の違いに注意する
  • ✅ 三項演算子で値を出し分け、??でNULLのときの既定値を決められる

次回は、条件によって処理を分ける「if文」について解説します。

次回は、今回学んだ比較演算子・論理演算子を使って、条件によって実行する処理を切り替えるif文について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


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