PHP 入門

PHP 演算子

PHP は、数学的な計算を実行したり、バリアブル(変数)の値を効率的に更新したりするための様々なオペレータ(演算子)を提供しています。これらのオペレータは、スクリプト内で数値を処理するための基礎となります。

1. 算術演算子

算術演算子は、足し算、引き算、掛け算、割り算、およびモジュロ(剰余)などの標準的な数学演算を実行するために使用されます。PHP は以下の算術演算子をサポートしています。

オペレータ名称結果($a = 10, $b = 3 の場合)
+加算$a + $b13
-減算$a - $b7
*乗算$a * $b30
/除算$a / $b3.333...
%モジュロ(剰余)$a % $b1
**指数(べき乗)$a ** $b1000

1.1 加算演算子 (+)

加算演算子は 2 つのオペランドを足し合わせます。インテジャー(整数)とフロート(浮動小数点数)の両方に使用できます。

<?php
$num1 = 15;
$num2 = 7;
$sum = $num1 + $num2; // $sum の値は 22 になります
echo "合計:" . $sum . "\n";

$price1 = 19.99;
$price2 = 5.50;
$totalPrice = $price1 + $price2; // $totalPrice の値は 25.49 になります
echo "合計金額:" . $totalPrice . "\n";
?>

1.2 減算演算子 (-)

減算演算子は、2 つのオペランド間の差を計算します。

<?php
$stockA = 100;
$soldA = 35;
$remainingA = $stockA - $soldA; // $remainingA の値は 65 になります
echo "残り在庫:" . $remainingA . "\n";

$temperatureNow = 28.5;
$temperatureYesterday = 32.1;
$temperatureChange = $temperatureNow - $temperatureYesterday; // $temperatureChange の値は -3.6 になります
echo "気温の変化:" . $temperatureChange . "\n";
?>

1.3 乗算演算子 (*)

乗算演算子は、2 つのオペランドの積を計算します。

<?php
$quantity = 12;
$unitPrice = 2.50;
$itemCost = $quantity * $unitPrice; // $itemCost の値は 30 になります
echo "商品のコスト:" . $itemCost . "\n";

$width = 7.5;
$height = 4.0;
$area = $width * $height; // $area の値は 30 になります
echo "面積:" . $area . "\n";
?>

1.4 除算演算子 (/)

除算演算子は、最初のオペランドを 2 番目のオペランドで割ります。PHP では、ゼロで割ると PHP Warning(警告) が発生し、オペランドに応じて INF(無限大) または NAN(非数値) が返されます。

<?php
$totalStudents = 40;
$groups = 8;
$studentsPerGroup = $totalStudents / $groups; // $studentsPerGroup の値は 5 になります
echo "1グループあたりの学生数:" . $studentsPerGroup . "\n";

$distance = 150.0;
$time = 2.5;
$speed = $distance / $time; // $speed の値は 60.0 になります
echo "速度:" . $speed . "\n";

// ゼロ除算の例(警告が発生し INF を出力)
// $result = 10 / 0;
// echo "ゼロ除算の結果:" . $result . "\n";
?>

1.5 モジュロ演算子 (%)

モジュロ演算子は、割り算の余り(剰余)を返します。これは、ある数値が奇数か偶数かを判定したり、ループ内での周期的なタスクを処理したりする際に非常に便利です。

<?php
$totalItems = 25;
$itemsPerPage = 6;
$remainingItems = $totalItems % $itemsPerPage; // $remainingItems の値は 1(25 / 6 = 4 余り 1)
echo "余ったアイテム:" . $remainingItems . "\n";

$number = 17;
$isEven = ($number % 2 == 0); // $isEven の値は false(17 % 2 = 1)
echo "17 は偶数ですか? " . ($isEven ? "はい" : "いいえ") . "\n";

$year = 2024;
// 閏年のルールは「4で割り切れるが、100で割り切れない(ただし400で割り切れる場合は閏年)」。
// ここでは簡略化のため、単に4で割り切れるかだけをチェックします。
$isLeapYearRoughly = ($year % 4 == 0); // $isLeapYearRoughly の値は true(2024 % 4 = 0)
echo "2024 年はおおよそ閏年ですか? " . ($isLeapYearRoughly ? "はい" : "いいえ") . "\n";
?>

1.6 指数演算子 ()

指数演算子は、最初のオペランドを底(ベース)、2 番目のオペランドを指数としてべき乗計算を行います。

<?php
$base = 2;
$power = 3;
$result = $base ** $power; // $result の値は 8 (2 * 2 * 2)
echo "2 の 3 乗:" . $result . "\n";

$radius = 5;
$areaCircle = M_PI * ($radius ** 2); // 円の面積を計算 (PI * r^2)
echo "半径 5 の円の面積:" . $areaCircle . "\n";
?>

※上記の例において、M_PI は PHP が提供するビルトイン定数で、円周率(Pi)の値を表します。

2. 代入演算子

代入演算子は、バリアブルに値を割り当てる(アサインする)ために使用されます。最も基本的な代入演算子は = で、右側の値を左側のバリアブルに代入します。また、算術演算と代入を 1 ステップで実行する「複合代入演算子」も用意されています。

オペレータ同等の式
=$a = $b$a = $b
+=$a += $b$a = $a + $b
-=$a -= $b$a = $a - $b
*=$a *= $b$a = $a * $b
/=$a /= $b$a = $a / $b
%=$a %= $b$a = $a % $b
**=$a **= $b$a = $a ** $b

2.1 単純代入演算子 (=)

このオペレータは、右側の値を左側のバリアブルにアサインします。

<?php
$score = 100; // インテジャー 100 を $score に代入
echo "スコア:" . $score . "\n";

$username = "john_doe"; // ストリング "john_doe" を $username に代入
echo "ユーザー名:" . $username . "\n";
?>

2.2 加算代入演算子 (+=)

右側の値を左側の値に加え、その結果を左側のバリアブルに代入します。

<?php
$currentValue = 50;
$currentValue += 10; // $currentValue = $currentValue + 10; と同等。現在は 60
echo "+= 10 実行後:" . $currentValue . "\n";

$balance = 1000.00;
$deposit = 250.75;
$balance += $deposit; // $balance は 1250.75 になります
echo "預金後の新しい残高:" . $balance . "\n";
?>

2.3 減算代入演算子 (-=)

左側の値から右側の値を引き、その結果を左側のバリアブルに代入します。

<?php
$stock = 200;
$sold = 75;
$stock -= $sold; // $stock = $stock - $sold; と同等。現在は 125
echo "残り在庫:" . $stock . "\n";

$debt = 500.00;
$payment = 150.00;
$debt -= $payment; // $debt は 350.00 になります
echo "残りの負債:" . $debt . "\n";
?>

2.4 乗算代入演算子 (*=)

左側の値を右側の値で掛け、その結果を左側のバリアブルに代入します。

<?php
$quantity = 5;
$quantity *= 3; // $quantity = $quantity * 3; と同等。現在は 15
echo "*= 3 実行後の数量:" . $quantity . "\n";

$price = 10.50;
$taxRate = 1.08; // 8% の税
$price *= $taxRate; // $price は 11.34 (10.50 * 1.08) になります
echo "税込価格:" . $price . "\n";
?>

2.5 除算代入演算子 (/=)

左側の値を右側の値で割り、その結果を左側のバリアブルに代入します。

<?php
$totalScore = 1000;
$totalScore /= 5; // $totalScore = $totalScore / 5; と同等。現在は 200
echo "平均点:" . $totalScore . "\n";

$value = 99.9;
$divisor = 3.3;
$value /= $divisor; // $value は 30.27... になります
echo "/= 3.3 実行後の値:" . $value . "\n";
?>

2.6 モジュロ代入演算子 (%=)

左側の値を右側の値で割った余りを計算し、その結果を左側のバリアブルに代入します。

<?php
$counter = 17;
$counter %= 5; // $counter = $counter % 5; と同等。現在は 2 (17 / 5 = 3 余り 2)
echo "%= 5 実行後のカウンター:" . $counter . "\n";

$dayOfWeek = 8; // 0 = 日曜日, 1 = 月曜日, ..., 6 = 土曜日 と仮定
$dayOfWeek %= 7; // $dayOfWeek は 1 (8 % 7 = 1)、つまり月曜日になります
echo "現在の曜日(0-6):" . $dayOfWeek . "\n";
?>

2.7 指数代入演算子 (=)

左側の値を右側の値で指定された回数だけ累乗し、その結果を左側のバリアブルに代入します。

<?php
$num = 2;
$num **= 4; // $num = $num ** 4; と同等。現在は 16 (2 * 2 * 2 * 2)
echo "**= 4 実行後の数値:" . $num . "\n";

$baseValue = 3;
$exponent = 2;
$baseValue **= $exponent; // $baseValue は 9 (3 * 3) になります
echo "べき乗演算後の底の値:" . $baseValue . "\n";
?>

複合代入演算子は、バリアブルを更新するための簡潔な記述方法を提供し、コードの可読性とコーディング効率を向上させます。

3. 演算子の優先順位と結合性

一つの式の中に複数のオペレータが含まれている場合、PHP は優先順位(Precedence)結合性(Associativity)のルールに従って計算順序を決定します。

  • 優先順位: 高い優先順位を持つオペレータは、低い優先順位のオペレータよりも先に計算されます。例えば、乗算 (*) や除算 (/) は加算 (+) や減算 (-) よりも優先順位が高いため、5 + 3 * 2 では乗算が先に実行され(3 * 2 = 6)、その後に加算が行われます(5 + 6 = 11)。
  • 結合性: オペレータが同じ優先順位を持つ場合、結合性が計算の向きを決定します。ほとんどの算術演算子は「左結合」であり、左から右へ順に計算されます。例えば、10 / 2 * 5(10 / 2) * 5 となり、5 * 5 = 25 です。一方、指数演算子 (**) は「右結合」です(2 ** 3 ** 22 ** (3 ** 2)、つまり 2 ** 9 = 512 となります)。

丸括弧 () を使用することで、デフォルトの優先順位をオーバーライドし、計算順序を明示的に制御できます。括弧内の式は常に最優先で計算されます。

<?php
$result1 = 5 + 3 * 2; // 乗算優先:5 + 6 = 11
echo "結果 1:" . $result1 . "\n";

$result2 = (5 + 3) * 2; // 括弧優先:8 * 2 = 16
echo "結果 2:" . $result2 . "\n";

$result3 = 10 / 2 * 5; // 左結合性:(10 / 2) * 5 = 5 * 5 = 25
echo "結果 3:" . $result3 . "\n";

$result4 = 2 ** 3 ** 2; // 右結合性:2 ** (3 ** 2) = 2 ** 9 = 512
echo "結果 4:" . $result4 . "\n";
?>

優先順位を理解することは、予期しない計算結果を避けるために極めて重要です。疑わしい場合は、括弧を付けて意図した順序で実行されるようにするのが最も安全なプラクティスです。

4. 総合実践ケース

4.1 割引と最終価格の計算

Eコマースアプリケーションを開発していると想像してください。商品の割引後の価格と、税金を含めた最終的な決済価格を計算する必要があります。

<?php
$originalPrice = 120.00; // 商品の元の価格
$discountRate = 0.15;    // 15% の割引
$taxRate = 0.08;         // 8% の消費税

// 割引額の計算
$discountAmount = $originalPrice * $discountRate;
// 割引後の価格を計算
$priceAfterDiscount = $originalPrice - $discountAmount;
echo ($discountRate * 100) . "% 割引後の価格:$" . number_format($priceAfterDiscount, 2) . "\n";

// 割引後の価格に基づいて税額を計算
$taxAmount = $priceAfterDiscount * $taxRate;
// 税込みの最終価格を計算
$finalPrice = $priceAfterDiscount + $taxAmount;
echo ($taxRate * 100) . "% 税込みの最終価格:$" . number_format($finalPrice, 2) . "\n";

// 複合代入演算子を使用してより簡潔に:
echo "\n--- 複合代入演算子を使用 ---\n";
$itemPrice = 120.00;
$itemPrice -= ($itemPrice * 0.15); // 15% の割引を適用
echo "割引後の価格:$" . number_format($itemPrice, 2) . "\n";

$itemPrice *= (1 + 0.08); // 8% の税を加算 (1.08 を掛ける)
echo "最終決済価格:$" . number_format($itemPrice, 2) . "\n";
?>

4.2 在庫レベルの追跡

在庫管理システムでは、商品の在庫数をダイナミックに更新する必要があります。

<?php
$currentStock = 500; // 初期在庫数
echo "初期在庫:" . $currentStock . "\n";

$itemsSoldToday = 120;
$currentStock -= $itemsSoldToday; // 本日売れた分をマイナス
echo "本日の販売後の在庫:" . $currentStock . "\n";

$itemsReceivedShipment = 250;
$currentStock += $itemsReceivedShipment; // 新しく入荷した分をプラス
echo "入荷後の在庫:" . $currentStock . "\n";

$damagedItems = 15;
$currentStock -= $damagedItems; // 破損品をマイナス
echo "破損品控除後の在庫:" . $currentStock . "\n";

// 現在の在庫の 10% にあたる大口注文が発生
$bulkOrderQuantity = $currentStock * 0.10;
// 商品を小数点単位で売ることはできないため、通常は切り捨て処理を行います。
$currentStock -= floor($bulkOrderQuantity); // 約 10% を販売
echo "大口注文処理後(約10%減)の在庫:" . $currentStock . "\n";
?>