【6日でできるPHP入門】カプセル化とは

 カプセル化(Encapsulation)は「データ(プロパティ)とそれを操作するロジック(メソッド)を一体化し、外部からの不正な操作を遮断する」 オブジェクト指向の根幹機能です。PHP では アクセス修飾子public / protected / private)を用いて可視性を制御しつつ、必要な値の読み書きを セッター(setter)/ゲッター(getter) で公開するのが王道パターンです。ここではカプセル化の基本概念を実践例で段階的に解説します。

1.カプセル化の基礎

1.1. 情報隠蔽と公開インターフェース

目的具体的な効果
外部からの不整合操作を防ぐ。無効な値の代入や想定外の呼び出しを遮断
実装の自由度確保内部構造を変更しても利用側を壊さない。
保守性の向上バグ修正・リファクタ時の影響範囲を局所化

1.2. アクセス修飾子の役割

修飾子説明主な用途
publicどこからでも呼び出せる。公開 API
protected自クラス+派生クラス継承前提の拡張ポイント
private自クラス内のみ完全な内部実装

1.3. アクセス用メソッド(setter・getter)

名称含意戻り値 / 引数
セッター値を設定引数あり・戻り値なし(void 推奨)
ゲッター値を取得戻り値あり・引数なし

命名規約
setXxx() / getXxx() のように プロパティ名に由来 させると直感的。

2.セッター・ゲッター実装ガイド

2.1. 実装ルール

  1. プロパティは private(または protected
  2. 妥当性チェックはセッター側で行う
  3. 参照専用の値はゲッターのみ公開

2.2. サンプルプログラム ― Product クラス

ファイル名: sample.encap.php

<?php
class Product {
    // --- プロパティ ---
    private string $name;
    private int    $price;               // 税抜価格
    private static int $count = 0;       // 生成数

    // --- コンストラクタ ---
    public function __construct(string $name, int $price) {
        $this->setName($name);
        $this->setPrice($price);
        self::$count++;
        echo "商品「{$this->name}」を登録しました<br>";
    }

    // --- セッター ---
    public function setName(string $name): void {
        $this->name = $name;
    }
    public function setPrice(int $price): void {
        if ($price < 0) {
            throw new InvalidArgumentException('価格は 0 以上で指定してください');
        }
        $this->price = $price;
    }

    // --- ゲッター ---
    public function getName(): string  { return $this->name; }
    public function getPrice(): int    { return $this->price; }

    // --- 静的メソッド ---
    public static function getCount(): int {
        return self::$count;
    }
}

// -------- 処理部 --------
$p1 = new Product('りんご', 120);
$p2 = new Product('バナナ', 80);

echo "登録済み商品数:".Product::getCount()." 件<br>";
echo "{$p1->getName()} の価格:{$p1->getPrice()} 円<br>";
?>

実行結果

2.3. コード解説

行番号目的ポイント
4–7private プロパティ直接書き換え禁止&初期値なしで安全
8static $countクラス全体で共有する生成数
10–14コンストラクタセッター経由で初期化し、不正値を排除
23–29セッター価格の妥当性チェックをここで完結
31–33ゲッター読み取りのみ・副作用ゼロ
36–38static メソッドインスタンス不要で呼び出し可能

まとめ

カプセル化は 「外部に必要最小限のインターフェースだけを公開し、内部状態を守る」 設計哲学です。

  • private プロパティ+セッター/ゲッターで 情報隠蔽
  • 妥当性チェックはセッターで集中管理し 不整合を根絶