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。
これは「自分自身の」という意味です。
$hero1がattack()した時、$thisは「タロウ」を指します。$hero2がattack()した時、$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)
?>
まとめ:なぜクラスを使うの?
最初は「普通に書いたほうが早くない?」と思うかもしれません。
しかし、クラスを使うと以下のメリットがあります。
- 整理整頓: 「勇者に関する処理」はすべてHeroクラスの中にまとまるので、コードが読みやすくなる。
- 量産できる:
new Hero()するだけで、敵も味方も無限に作れる。 - 書き換えに強い: 「HPの計算式を変えたい」と思ったら、クラスの中を直すだけで全員に適用される。
Laravelなどのフレームワークは、この「クラス」の塊でできています。
今のうちに「設計図(クラス)」と「実体(インスタンス)」の関係に慣れておきましょう!
📝 今日のミニテスト
オブジェクト指向の基礎チェック!
Q1. クラス(設計図)から実体を生み出すために使うキーワードは?
正解:new
$obj = new ClassName(); のように書きます。これを「インスタンス化」と呼びます。
Q2. クラスの中で「自分自身のプロパティやメソッド」を指す特殊な変数は?
正解:$this
$this->name のように矢印(アロー演算子)を使ってアクセスします。
Q3. new した瞬間に自動的に実行される、初期化用のメソッド名は?
正解:__construct(コンストラクタ)
アンダーバーが2つ(__)あることに注意してください。