
【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. 実装ルール
- プロパティは
private(またはprotected) - 妥当性チェックはセッター側で行う
- 参照専用の値はゲッターのみ公開
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–7 | private プロパティ | 直接書き換え禁止&初期値なしで安全 |
| 8 | static $count | クラス全体で共有する生成数 |
| 10–14 | コンストラクタ | セッター経由で初期化し、不正値を排除 |
| 23–29 | セッター | 価格の妥当性チェックをここで完結 |
| 31–33 | ゲッター | 読み取りのみ・副作用ゼロ |
| 36–38 | static メソッド | インスタンス不要で呼び出し可能 |
まとめ
カプセル化は 「外部に必要最小限のインターフェースだけを公開し、内部状態を守る」 設計哲学です。
privateプロパティ+セッター/ゲッターで 情報隠蔽- 妥当性チェックはセッターで集中管理し 不整合を根絶
