PHP演算子の完全ガイド – 初心者でもわかる使い方と実例

その他

「PHPで計算したいけど、どう書けばいいの?」
=====って何が違うの?」
&&andはどちらを使えばいい?」

そんな疑問を持つあなたのために、PHPの演算子について、わかりやすく説明します。

演算子とは、計算や比較、条件判定などを行うための記号のことです。

これらを覚えることで、もっと便利で読みやすいプログラムが書けるようになります。

スポンサーリンク

この記事でわかること

  • 算術演算子(足し算、引き算など)
  • 比較演算子(等しい、大きいなど)
  • 論理演算子(かつ、または、でないなど)
  • 代入演算子(値を入れる方法)
  • 便利な特殊演算子
  • 実際のWebサイトでの使用例

算術演算子(計算をしよう)

基本的な計算

数学と同じように、プログラムでも計算ができます。

演算子意味結果
+足し算5 + 38
-引き算5 - 32
*掛け算5 * 315
/割り算10 / 25
%余り10 % 31
**べき乗2 ** 38

実際の使用例

<?php
// ショッピングサイトの計算例
$price = 1000;        // 商品価格
$quantity = 3;        // 購入数
$taxRate = 0.1;       // 消費税率

// 小計
$subtotal = $price * $quantity;  // 3000

// 税込み価格
$total = $subtotal * (1 + $taxRate);  // 3300

echo "小計: {$subtotal}円";
echo "合計: {$total}円";
?>

余り(%)の便利な使い方

<?php
// 偶数か奇数かを判定
$number = 7;
if ($number % 2 == 0) {
    echo "偶数です";
} else {
    echo "奇数です";  // こちらが実行される
}

// 3で割り切れるかチェック
$score = 90;
if ($score % 3 == 0) {
    echo "3で割り切れます";
}

// 10個ずつ区切って表示
for ($i = 1; $i <= 25; $i++) {
    echo $i . " ";
    if ($i % 10 == 0) {
        echo "<br>";  // 10個ごとに改行
    }
}
?>

注意点

ゼロ除算エラー:

<?php
$a = 10;
$b = 0;

// これはエラーになる
// $result = $a / $b;  // Fatal error: Division by zero

// 安全な書き方
if ($b != 0) {
    $result = $a / $b;
} else {
    echo "0で割ることはできません";
}
?>

比較演算子(値を比べよう)

基本的な比較

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

==と===の重要な違い

<?php
// == は値だけを比較(型変換あり)
var_dump(1 == "1");      // bool(true)
var_dump(0 == false);    // bool(true)
var_dump("" == false);   // bool(true)
var_dump(null == false); // bool(true)

// === は値と型の両方を比較(型変換なし)
var_dump(1 === "1");      // bool(false)
var_dump(0 === false);    // bool(false)
var_dump("" === false);   // bool(false)
var_dump(null === false); // bool(false)
?>

推奨:基本的には===を使いましょう

理由:予期しない型変換を避けられるため、バグが少なくなります。

実際の使用例

<?php
// ユーザーのログイン処理
$inputPassword = $_POST['password'] ?? '';
$correctPassword = 'secret123';

if ($inputPassword === $correctPassword) {
    echo "ログイン成功";
} else {
    echo "パスワードが間違っています";
}

// 年齢制限のチェック
$age = 17;
if ($age >= 18) {
    echo "成人向けコンテンツを表示";
} else {
    echo "年齢制限により表示できません";
}

// フォームの入力チェック
$email = $_POST['email'] ?? '';
if ($email === '') {
    echo "メールアドレスを入力してください";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "正しいメールアドレスを入力してください";
} else {
    echo "メールアドレスは正常です";
}
?>

論理演算子(条件を組み合わせよう)

基本的な論理演算

演算子意味説明
&&かつ(AND)$a && $b両方が真なら真
||または(OR)$a || $bどちらかが真なら真
!でない(NOT)!$a真なら偽、偽なら真
andかつ(低優先度)$a and $b&&と同じだが優先度が低い
orまたは(低優先度)$a or $b||と同じだが優先度が低い

実際の使用例

<?php
// 会員限定コンテンツの表示条件
$isLoggedIn = true;    // ログイン済み
$isPremium = false;    // プレミアム会員ではない

if ($isLoggedIn && $isPremium) {
    echo "プレミアムコンテンツを表示";
} elseif ($isLoggedIn) {
    echo "通常会員コンテンツを表示";
} else {
    echo "ログインしてください";
}

// 営業時間の判定
$hour = 14;  // 午後2時
if ($hour >= 9 && $hour < 18) {
    echo "営業中です";
} else {
    echo "営業時間外です";
}

// 休日の判定
$dayOfWeek = 'Saturday';
if ($dayOfWeek === 'Saturday' || $dayOfWeek === 'Sunday') {
    echo "休日です";
} else {
    echo "平日です";
}
?>

NOT演算子(!)の使い方

<?php
$isActive = false;

// 否定の判定
if (!$isActive) {
    echo "アクティブではありません";
}

// 空でない場合の判定
$name = "";
if (!empty($name)) {
    echo "名前: $name";
} else {
    echo "名前が入力されていません";
}

// 配列に要素があるかチェック
$items = [];
if (!empty($items)) {
    echo "商品があります";
} else {
    echo "商品がありません";
}
?>

ショートサーキット評価

PHPの論理演算子は「ショートサーキット評価」を行います。

<?php
// &&の場合:左が偽なら、右は評価されない
$a = false;
$b = true;

if ($a && someFunction()) {
    // someFunction()は実行されない($aがfalseなので)
}

// ||の場合:左が真なら、右は評価されない
$c = true;
$d = false;

if ($c || someFunction()) {
    // someFunction()は実行されない($cがtrueなので)
    echo "実行されます";
}
?>

代入演算子(値を効率的に更新しよう)

基本的な代入

<?php
$x = 10;        // 基本的な代入
$y = $x;        // 変数の値をコピー
$z = $x + $y;   // 計算結果を代入
?>

複合代入演算子

演算子同じ意味
+=$a = $a + $b$a += 5
-=$a = $a - $b$a -= 3
*=$a = $a * $b$a *= 2
/=$a = $a / $b$a /= 4
%=$a = $a % $b$a %= 3
.=$a = $a . $b$a .= "追加"

実際の使用例

<?php
// カウンターの更新
$clickCount = 0;
$clickCount += 1;  // $clickCount = $clickCount + 1; と同じ
echo "クリック数: $clickCount";

// 割引計算
$price = 1000;
$price *= 0.9;  // 10%割引
echo "割引後価格: $price円";

// 文字列の連結
$message = "こんにちは";
$message .= "、世界!";  // $message = $message . "、世界!"; と同じ
echo $message;  // "こんにちは、世界!"

// ショッピングカートの商品数
$cartItems = 2;
$cartItems += 3;  // 3個追加
echo "カート内商品数: $cartItems個";
?>

インクリメント・デクリメント

<?php
$counter = 5;

// 前置インクリメント(先に1を足す)
echo ++$counter;  // 6

// 後置インクリメント(後で1を足す)
echo $counter++;  // 6(表示後に7になる)
echo $counter;    // 7

// 前置デクリメント(先に1を引く)
echo --$counter;  // 6

// 後置デクリメント(後で1を引く)
echo $counter--;  // 6(表示後に5になる)
echo $counter;    // 5
?>

実用例:

<?php
// ページ番号の操作
$page = 1;
$nextPage = $page + 1;  // 2
$page++;                // pageは2になる

// ループでの使用
for ($i = 0; $i < 10; $i++) {
    echo "ループ回数: $i<br>";
}
?>

特殊な演算子(便利な書き方)

三項演算子(条件演算子)

基本形: 条件 ? 真の場合の値 : 偽の場合の値

<?php
// 基本的な使い方
$score = 75;
$result = ($score >= 60) ? "合格" : "不合格";
echo $result;  // "合格"

// if文との比較
// 三項演算子版
$status = ($isLoggedIn) ? "ログイン中" : "未ログイン";

// if文版(同じ結果)
if ($isLoggedIn) {
    $status = "ログイン中";
} else {
    $status = "未ログイン";
}
?>

実用例:

<?php
// HTMLクラス名の切り替え
$isActive = true;
$cssClass = $isActive ? 'active' : 'inactive';
echo "<div class='$cssClass'>コンテンツ</div>";

// 価格表示
$price = 0;
$priceText = ($price > 0) ? "{$price}円" : "無料";
echo $priceText;

// 配列の要素数によるメッセージ
$items = ['apple', 'banana'];
$message = (count($items) > 0) ? count($items) . "個の商品があります" : "商品がありません";
echo $message;
?>

NULL合体演算子(??)

PHP 7.0以降で使用可能

<?php
// 基本的な使い方
$username = $_POST['username'] ?? 'ゲスト';
// $_POST['username']が存在して、nullでなければその値、そうでなければ'ゲスト'

// 従来の書き方との比較
// NULL合体演算子版
$name = $_GET['name'] ?? 'デフォルト名';

// 従来版(同じ結果)
$name = isset($_GET['name']) ? $_GET['name'] : 'デフォルト名';
?>

実用例:

<?php
// 設定値のデフォルト
$pageSize = $_GET['per_page'] ?? 10;
$sortOrder = $_GET['sort'] ?? 'asc';

// ユーザー情報の表示
$user = [
    'name' => 'John',
    'email' => 'john@example.com'
    // 'phone'は設定されていない
];

echo "名前: " . ($user['name'] ?? '未設定') . "<br>";
echo "電話: " . ($user['phone'] ?? '未登録') . "<br>";

// 連鎖的な使用
$config = $_ENV['CONFIG'] ?? $_POST['config'] ?? 'default.conf';
?>

NULL合体代入演算子(??=)

PHP 7.4以降で使用可能

<?php
// 値が存在しない場合のみ代入
$options = [];
$options['theme'] ??= 'default';  // 'default'が代入される
$options['theme'] ??= 'dark';     // 既に値があるので何もしない

echo $options['theme'];  // 'default'

// 実用例:設定の初期化
$userSettings['notifications'] ??= true;
$userSettings['language'] ??= 'ja';
$userSettings['timezone'] ??= 'Asia/Tokyo';
?>

スペースシップ演算子(<=>)

PHP 7.0以降で使用可能

<?php
// 比較結果を-1, 0, 1で返す
echo 1 <=> 2;   // -1 (左が小さい)
echo 2 <=> 2;   // 0  (同じ)
echo 3 <=> 2;   // 1  (左が大きい)

// 配列のソートで使用
$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
    ['name' => 'Charlie', 'age' => 20]
];

// 年齢でソート
usort($users, function($a, $b) {
    return $a['age'] <=> $b['age'];
});

// 結果:Charlie(20), Alice(25), Bob(30)の順
?>

演算子の優先順位

重要な優先順位

優先度演算子
()($a + $b) * $c
!!$flag
*, /, %$a * $b / $c
+, -$a + $b - $c
<, <=, >, >=$a < $b
==, ===, !=, !==$a == $b
&&$a && $b
||$a || $b
? :$a ? $b : $c
=, +=, -=$a = $b

括弧を使った明確な書き方

<?php
// 優先順位が曖昧な場合は括弧を使う
$result = ($a + $b) * ($c - $d);

// 複雑な条件式
if (($age >= 18 && $hasLicense) || $isSpecialCase) {
    echo "運転可能";
}

// 計算の順序を明確にする
$tax = ($price * $quantity) * $taxRate;
?>

文字列演算子

文字列の結合

<?php
// 結合演算子(.)
$firstName = "山田";
$lastName = "太郎";
$fullName = $firstName . $lastName;  // "山田太郎"

// 結合代入演算子(.=)
$message = "こんにちは";
$message .= "、";
$message .= $fullName;
$message .= "さん";
echo $message;  // "こんにちは、山田太郎さん"
?>

実用的な例

<?php
// HTMLタグの生成
$id = "user-123";
$class = "user-card active";
$name = "田中花子";

$html = '<div id="' . $id . '" class="' . $class . '">';
$html .= '<h3>' . $name . '</h3>';
$html .= '</div>';
echo $html;

// CSVデータの作成
$data = ["商品A", "1000", "10"];
$csvLine = implode(",", $data);  // "商品A,1000,10"

// URLの構築
$baseUrl = "https://example.com";
$path = "/api/users";
$params = "?page=1&limit=10";
$fullUrl = $baseUrl . $path . $params;
echo $fullUrl;  // "https://example.com/api/users?page=1&limit=10"
?>

実践的な使用例

ユーザー認証システム

<?php
function authenticateUser($username, $password) {
    $validUsers = [
        'admin' => 'secret123',
        'user1' => 'password456'
    ];
    
    // ユーザー名の存在確認と パスワード照合
    if (isset($validUsers[$username]) && $validUsers[$username] === $password) {
        return true;
    }
    
    return false;
}

// 使用例
$inputUser = $_POST['username'] ?? '';
$inputPass = $_POST['password'] ?? '';

if (authenticateUser($inputUser, $inputPass)) {
    $_SESSION['logged_in'] = true;
    $_SESSION['username'] = $inputUser;
    echo "ログイン成功";
} else {
    echo "ユーザー名またはパスワードが間違っています";
}
?>

ショッピングカートシステム

<?php
class ShoppingCart {
    private $items = [];
    private $taxRate = 0.1;  // 10%の消費税
    
    public function addItem($productId, $price, $quantity = 1) {
        if (isset($this->items[$productId])) {
            $this->items[$productId]['quantity'] += $quantity;
        } else {
            $this->items[$productId] = [
                'price' => $price,
                'quantity' => $quantity
            ];
        }
    }
    
    public function getTotalAmount() {
        $subtotal = 0;
        
        foreach ($this->items as $item) {
            $subtotal += $item['price'] * $item['quantity'];
        }
        
        $tax = $subtotal * $this->taxRate;
        $total = $subtotal + $tax;
        
        return [
            'subtotal' => $subtotal,
            'tax' => $tax,
            'total' => $total
        ];
    }
    
    public function hasDiscount($amount) {
        return $amount >= 5000;  // 5000円以上で割引対象
    }
}

// 使用例
$cart = new ShoppingCart();
$cart->addItem('product1', 1000, 2);  // 1000円の商品を2個
$cart->addItem('product2', 1500, 1);  // 1500円の商品を1個

$amounts = $cart->getTotalAmount();
$hasDiscount = $cart->hasDiscount($amounts['total']);

echo "小計: " . number_format($amounts['subtotal']) . "円<br>";
echo "税額: " . number_format($amounts['tax']) . "円<br>";
echo "合計: " . number_format($amounts['total']) . "円<br>";
echo ($hasDiscount ? "割引対象です" : "割引対象外です");
?>

フォームバリデーション

<?php
function validateForm($data) {
    $errors = [];
    
    // 名前のチェック
    $name = trim($data['name'] ?? '');
    if ($name === '') {
        $errors['name'] = '名前を入力してください';
    } elseif (strlen($name) > 50) {
        $errors['name'] = '名前は50文字以内で入力してください';
    }
    
    // メールアドレスのチェック
    $email = trim($data['email'] ?? '');
    if ($email === '') {
        $errors['email'] = 'メールアドレスを入力してください';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = '正しいメールアドレスを入力してください';
    }
    
    // 年齢のチェック
    $age = $data['age'] ?? 0;
    if (!is_numeric($age) || $age < 0 || $age > 120) {
        $errors['age'] = '正しい年齢を入力してください';
    }
    
    // パスワードのチェック
    $password = $data['password'] ?? '';
    if (strlen($password) < 8) {
        $errors['password'] = 'パスワードは8文字以上で入力してください';
    } elseif (!preg_match('/[A-Za-z]/', $password) || !preg_match('/[0-9]/', $password)) {
        $errors['password'] = 'パスワードは英字と数字を含めてください';
    }
    
    return $errors;
}

// 使用例
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $errors = validateForm($_POST);
    
    if (empty($errors)) {
        echo "フォームの入力が正常です!";
        // データベースに保存などの処理
    } else {
        echo "以下のエラーを修正してください:<br>";
        foreach ($errors as $field => $message) {
            echo "- {$message}<br>";
        }
    }
}
?>

よくある間違いと対策

代入と比較の混同

<?php
// 間違い:代入演算子を使ってしまう
if ($status = 'active') {  // ❌ 常にtrueになる
    echo "アクティブです";
}

// 正しい:比較演算子を使う
if ($status === 'active') {  // ✅
    echo "アクティブです";
}
?>

型の混同

<?php
// 注意が必要な比較
var_dump(0 == false);    // true(予期しない結果の可能性)
var_dump(0 === false);   // false(型も厳密に比較)

var_dump("10" == 10);    // true
var_dump("10" === 10);   // false

// 推奨:厳密比較を使う
if ($userInput === "0") {  // 文字列の"0"
    // 処理
}
?>

論理演算子の優先順位

<?php
// 間違いやすい例
$result = true || false && false;  // true(&& が先に評価される)

// 明確にするために括弧を使用
$result = (true || false) && false;  // false
$result = true || (false && false);  // true
?>

まとめ

PHPの演算子をマスターすることで、より効率的で読みやすいコードが書けるようになります。

この記事のポイント:

  • 算術演算子:基本的な計算操作
  • 比較演算子:===を使った厳密な比較を推奨
  • 論理演算子:条件の組み合わせに活用
  • 代入演算子:+=.=などで効率的な更新
  • 特殊演算子:三項演算子、NULL合体演算子で簡潔な記述

コメント

タイトルとURLをコピーしました