【PHP応用-番外編】「クラス(Class)」って結局なんなの?オブジェクト指向をドラクエ風に解説

PHPを勉強していると、必ずぶつかる壁があります。
それが「クラス(Class)」「オブジェクト指向」という言葉です。

「普通の変数や関数じゃダメなの?」「難しそう…」
そう思うのも無理はありません。しかし、これを使えるようになると、大規模なシステムを驚くほど整理整頓して書けるようになります。

今回は、難しい専門用語は抜きにして、「RPGのキャラクター作り」に例えて解説します。

1. クラス = 「設計図」

RPGで、勇者を何人も生み出したいとします。
一人ひとり「勇者Aの名前は…HPは…」「勇者Bの名前は…HPは…」と書くのは大変ですよね。

そこで、「勇者を作るための金型(設計図)」を用意します。
これがクラス(Class)です。

クラス(設計図)に書くこと:

  • プロパティ(変数): 名前、HP、攻撃力などの「データ」。
  • メソッド(関数): 攻撃する、逃げる、寝るなどの「動作」。

書き方

class Hero {
    // プロパティ(データ)
    public $name;
    public $hp;

    // メソッド(動作)
    public function attack() {
        echo "{$this->name} の攻撃!";
    }
}

2. インスタンス = 「実体化」

設計図(クラス)があるだけでは、ゲームの中に勇者は現れません。
設計図を元に、「実体(モノ)」を生み出す必要があります。

これを「インスタンス化(new)」と呼びます。

// 設計図(Hero)から、実体($hero1)を生み出す!
$hero1 = new Hero();

// 中身を設定する
$hero1->name = "勇者タロウ";
$hero1->hp   = 100;

// 動作させる
$hero1->attack(); 
// 結果:「勇者タロウ の攻撃!」

「設計図は1つだけど、実体は何個でも作れる」のがポイントです。

$hero2 = new Hero();
$hero2->name = "勇者ハナコ";
$hero2->attack(); 
// 結果:「勇者ハナコ の攻撃!」

3. 謎の変数「$this」の正体

クラスの中で頻繁に出てくる $this
これは「自分自身の」という意味です。

  • $hero1attack() した時、$this は「タロウ」を指します。
  • $hero2attack() した時、$this は「ハナコ」を指します。

「私の名前($this->name)を表示して!」という台本を1つ書いておけば、誰が演じても正しく自分の名前を言えるようになるのです。

4. 便利な「コンストラクタ」

毎回 $hero1->name = ... と設定するのは面倒ですよね。
「生まれた瞬間(newした瞬間)」に名前やHPをセットできたら楽です。

そのための特別な関数が __construct(コンストラクタ) です。

完成版コード:戦う勇者クラス

<?php

class Hero {
    public $name;
    public $hp;

    // 生まれた瞬間に実行される関数
    public function __construct($name, $hp) {
        $this->name = $name; // 引数を自分のプロパティに入れる
        $this->hp   = $hp;
    }

    public function attack() {
        echo "⚔️ {$this->name} は攻撃した!<br>";
    }

    public function damage($point) {
        $this->hp -= $point;
        echo "💥 {$this->name} は {$point} のダメージを受けた!(残りHP: {$this->hp})<br>";
    }
}

// === ここからメインの処理 ===

// 生まれた瞬間に名前とHPが決まる!
$hero = new Hero("勇者タロウ", 100);
$maou = new Hero("魔王", 500);

$hero->attack();  // 勇者タロウ は攻撃した!
$maou->damage(50); // 魔王 は 50 のダメージを受けた!(残りHP: 450)

?>

まとめ:なぜクラスを使うの?

最初は「普通に書いたほうが早くない?」と思うかもしれません。
しかし、クラスを使うと以下のメリットがあります。

  1. 整理整頓: 「勇者に関する処理」はすべてHeroクラスの中にまとまるので、コードが読みやすくなる。
  2. 量産できる: new Hero() するだけで、敵も味方も無限に作れる。
  3. 書き換えに強い: 「HPの計算式を変えたい」と思ったら、クラスの中を直すだけで全員に適用される。

Laravelなどのフレームワークは、この「クラス」の塊でできています。
今のうちに「設計図(クラス)」「実体(インスタンス)」の関係に慣れておきましょう!

📝 今日のミニテスト

オブジェクト指向の基礎チェック!

Q1. クラス(設計図)から実体を生み出すために使うキーワードは?

正解:new
$obj = new ClassName(); のように書きます。これを「インスタンス化」と呼びます。

 

Q2. クラスの中で「自分自身のプロパティやメソッド」を指す特殊な変数は?

正解:$this
$this->name のように矢印(アロー演算子)を使ってアクセスします。

 

Q3. new した瞬間に自動的に実行される、初期化用のメソッド名は?

正解:__construct(コンストラクタ)
アンダーバーが2つ(__)あることに注意してください。

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