【PHP】Lesson5-1:クラス定義とインスタンス|オブジェクト指向の入り口

ながみえ

一つ前のレッスンでは PHPのデータ構造 について学習しました。

今回は クラス定義とインスタンス生成 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
Lesson4:データ構造編
Lesson5:クラス

 ・Lesson5-1:クラスを定義しよう ◁今回はココ
 ・Lesson5-2:コンストラクタを理解しよう
 ・Lesson5-3:アクセス修飾子とカプセル化を理解しよう
 ・Lesson5-4:クラスメンバを理解しよう
 ・Lesson5-5:クラスの継承を理解しよう
 ・Lesson5-6:メソッドのオーバーライドを理解しよう
 ・Lesson5-7:抽象クラスを理解しよう
 ・Lesson5-8:インターフェースを理解しよう
 ・Lesson5-9:トレイトを理解しよう
 ・確認問題5-1:モンスター捕獲ゲームを作ろう
 ・確認問題5-2:マインスイーパを作ろう

<<前のページ

学習記事一覧

次のページ>>

クラスとインスタンスの基礎|定義から実践までわかりやすく解説

PHPを使って本格的なWebアプリケーションを開発するためには、「クラス」の理解が欠かせません。

この記事ではPHPのクラスの基本的な定義方法から、実際にインスタンスを生成する手順までを分かりやすく解説します。

「クラスやインスタンスって何?」「どうやって使えばいいの?」といった初心者の方の疑問にも丁寧に答えていますので、ぜひ最後まで読み進めて、PHPオブジェクト指向の基礎をしっかり身につけましょう。

クラスとは何か?|初心者にも分かるオブジェクト指向の設計図

クラスとは、データと処理をまとめて扱うための「設計図」です。

たとえば、「犬」というクラスを定義すると、その犬が持つ「名前」や「年齢」などの情報(プロパティ)と、「吠える」や「走る」などの動作(メソッド)をひとまとめにできます。

これにより、データとそれに関連する処理を整理して管理できます。

PHPでクラスを定義するには以下のように書きます。

class クラス名 {					 // 新しいクラスを定義
    public $変数;					   // プロパティ(変数)の宣言
    public function メソッド名() {	// メソッド(関数)の定義
        // このメソッドの処理内容
    }
}
  • classキーワード: クラスを定義するために使用します。
  • プロパティ: クラス内で管理するデータを変数として宣言します。
  • メソッド: クラスの中にある関数はメソッドと呼びます。

publicの役割について:
コード内に出てくる public は「アクセス修飾子」と呼ばれるもので、プロパティやメソッドへのアクセス権限を決めるために使われます。
詳細は Lesson5-3 で学習しますので、ここでは「クラス内に定義する変数やメソッドに必要なもの」と理解しましょう。

インスタンス生成とは?|クラスからオブジェクトを作る仕組み

クラスとはあくまでもデータと動作を書いた設計図にすぎず、クラスそのものが動作することはありません。

定義したクラスを使うには、インスタンスを生成する必要があります。

インスタンスとは、クラスという設計図から生成される具体的なオブジェクトのことです。

クラス = データや動作を書いた設計図。クラス自体は動作しない。
インスタンス = クラスから作られる、実際に動作するプログラム。

インスタンスは、定義したクラス名に newキーワード を使用し、変数に格納することで生成できます。

以下は簡単なクラスの定義とインスタンス生成を実装したコードの例です。

<?php
class Dog {							// Dogという名前のクラスの定義
    public $name = "ポチ";		  // 変数(プロパティ)の宣言
    public $age = "3";				// 変数(プロパティ)の宣言
    public function bark() {		// barkメソッドの定義
        echo "ワンワン!" . PHP_EOL;	// このメソッドの処理内容
    }
}

$dog = new Dog();	// Dogクラスのインスタンスを生成し、変数$dogに代入

echo "名前: " . $dog->name . PHP_EOL;		  // 変数$dog1の中のプロパティを出力
echo "年齢: " . $dog->age . "歳" . PHP_EOL; // 変数$dog1の中のプロパティを出力
$dog->bark();							    // 変数$dog1の中のbark()メソッドの呼び出し

このコードを実行すると以下のように出力されます。

名前: ポチ
年齢: 3歳
ワンワン!

このように、クラスをオブジェクト化(インスタンス生成)することで一つの変数の中に多くのデータや機能を盛り込むことができます。

そのデータや機能を呼び出す際には、上記のコードのように ->演算子 を使用します。

クラスの活用例|複数インスタンスの生成と使い方

インスタンスはクラスを元に作成される具体的なオブジェクトです。

1つのクラスから複数のインスタンスを作成することで、異なるデータを持つオブジェクトを扱うことができます。

以下のコードを見てみましょう。

<?php
class Dog {				// Dogという名前のクラスの定義
    public $name;		// 変数(プロパティ)の宣言
    public function move(){
        echo "{$this->name}は走っています!" . PHP_EOL;
    }					// クラス内で定義した変数をメソッドで使用する場合は
}						// このように「$this->変数名」と書く

$dog1 = new Dog();		// Dogクラスのインスタンスを変数$dog1に代入
$dog1->name = "ポチ";	  // "$dog1の中の" 変数$nameにポチという文字列を代入
echo $dog1->move();		// 出力:ポチは走っています!

$dog2 = new Dog();		// Dogクラスのインスタンスを変数$dog2に代入
$dog2->name = "シロ";	  // "$dog2の中の" 変数$nameにシロという文字列を代入
echo $dog2->move();		// 出力:シロは走っています!

このように、インスタンスは互いに独立したデータを保持します。

またクラス内のメソッドでそのクラス内変数を使用する場合は、このコードのように「$this->変数名」と書く必要があることも覚えておきましょう。

その理由については、Lesson5-3で学習します。

まとめ|クラスとインスタンス生成の基礎を身につけよう

下記の図はこれから学習するレッスン5「クラス編」の概要を全てまとめたものです。

この記事の内容は、図上部の子クラス1からメインプログラム内へのインスタンス生成している部分に該当します。

この記事を学習して「クラス」とは何か、その設計図の役割や、実際にオブジェクト(インスタンス)を作り出す仕組みが理解できたかと思います。

また、一つのクラスから複数のインスタンスを生成できることで、より柔軟かつ効率的にプログラムを構築できるようになりました。

オブジェクト指向の基礎を理解した今、さらに高度な使い方や実践的な活用方法にもチャレンジしていきましょう。

着実なステップアップで、あなたのプログラミングスキルは確実に伸びていきます!

演習問題|クラスを使って動物園の管理プログラムを作ろう

動物園の動物を管理するためのプログラムを作成しましょう。

このプログラムでは「動物クラス」を作成し、各動物の名前や種類を管理します。さらに、各動物が鳴き声を出す機能を実装します。

この練習を通して、クラスの定義と使用方法を学びます。

この演習の要件

以下の要件に従ってコードを完成させてください。

  1. クラスの定義
    • Animalという名前のクラスを作成すること。
  2. プロパティの定義
    • プロパティ $name に動物の名前を保持すること。
    • プロパティ $type に動物の種類を保持すること。
  3. メソッドの定義
    • showInfo メソッドを作成し、動物の名前と種類を出力すること。
    • makeSound メソッドを作成し、引数で受け取った鳴き声を出力すること。
  4. インスタンスの作成と操作
    • Animal クラスからインスタンスを2つ作成すること。
    • 1つ目のインスタンスには「ライオン」という名前と「肉食動物」という種類を設定すること。
    • 2つ目のインスタンスには「ゾウ」という名前と「草食動物」という種類を設定すること。
  5. 動作の確認
    • 各インスタンスに対して showInfo メソッドと makeSound メソッドを呼び出し、結果を表示すること。

ただし、以下のような実行結果となること。

名前: ライオン  
種類: 肉食動物  
ライオンは「ガオー」と鳴きます。  

名前: ゾウ  
種類: 草食動物  
ゾウは「パオーン」と鳴きます。

解き方のヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:PHPスクリプトの開始宣言
2:Animalクラスの定義
  □ プロパティ$nameをpublicとして宣言(動物の名前を保持)
  □ プロパティ$typeをpublicとして宣言(動物の種類を保持)
  □ showInfoメソッドの定義(動物の情報を表示する)
  □ □ $nameプロパティの値を「名前: 」という文字列と共に出力
  □ □ $typeプロパティの値を「種類: 」という文字列と共に出力
  □ makeSoundメソッドの定義(鳴き声を出す)
  □ □ 引数$soundを受け取り、「[名前]は「[鳴き声]」と鳴きます。」という形式で出力
3:Animalクラスのインスタンス($animal1)を作成
4:$animal1のプロパティnameに「ライオン」を代入
5:$animal1のプロパティtypeに「肉食動物」を代入
6:$animal1のshowInfoメソッドを呼び出し、情報を出力
7:$animal1のmakeSoundメソッドを呼び出し、「ガオー」という鳴き声を出力
8:空行を出力(区切り線として)
9:Animalクラスの別インスタンス($animal2)を作成
10:$animal2のプロパティnameに「ゾウ」を代入
11:$animal2のプロパティtypeに「草食動物」を代入
12:$animal2のshowInfoメソッドを呼び出し、情報を出力
13:$animal2のmakeSoundメソッドを呼び出し、「パオーン」という鳴き声を出力

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

<?php
/*
【穴埋め問題1】ここでAnimalクラスを定義し、動物の名前と種類を保持するプロパティを作成してください。
*/

/*
【穴埋め問題2】ここで動物の情報を表示するshowInfoメソッドを定義し、名前と種類を表示するコードを書いてください。
*/

/*
【穴埋め問題3】ここで鳴き声を表示するmakeSoundメソッドを定義し、指定された鳴き声を出力するコードを書いてください。
*/

// クラスの使用例 - インスタンス化と操作
$animal1 = new Animal(); // Animalクラスからインスタンスを作成
$animal1->name = "ライオン"; // 名前を設定
$animal1->type = "肉食動物"; // 種類を設定
$animal1->showInfo(); // 情報を表示
$animal1->makeSound("ガオー"); // 鳴き声を表示

echo PHP_EOL; // 区切り行

$animal2 = new Animal(); // 別のインスタンスを作成
$animal2->name = "ゾウ"; // 名前を設定
$animal2->type = "草食動物"; // 種類を設定
$animal2->showInfo(); // 情報を表示
$animal2->makeSound("パオーン"); // 鳴き声を表示

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

演習問題の答え合わせ

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
<?php
// クラスの定義 - Animalクラスを定義
class Animal {
    // プロパティ - 動物の名前と種類を保持する
    public $name; // 動物の名前
    public $type; // 動物の種類

    // メソッド - 動物の情報を表示する
    public function showInfo() {
        echo "名前: " . $this->name . PHP_EOL; // 名前を表示
        echo "種類: " . $this->type . PHP_EOL; // 種類を表示
    }

    // メソッド - 鳴き声を出す
    public function makeSound($sound) {
        echo $this->name . "は「" . $sound . "」と鳴きます。" . PHP_EOL;
    }
}

// クラスの使用例 - インスタンス化と操作
$animal1 = new Animal(); // Animalクラスからインスタンスを作成
$animal1->name = "ライオン"; // 名前を設定
$animal1->type = "肉食動物"; // 種類を設定
$animal1->showInfo(); // 情報を表示
$animal1->makeSound("ガオー"); // 鳴き声を表示

echo PHP_EOL; // 区切り行

$animal2 = new Animal(); // 別のインスタンスを作成
$animal2->name = "ゾウ"; // 名前を設定
$animal2->type = "草食動物"; // 種類を設定
$animal2->showInfo(); // 情報を表示
$animal2->makeSound("パオーン"); // 鳴き声を表示
Q
正解コードの解説

コードをブロックごとに分割して解説します。

クラスの定義

class Animal {
  • class キーワード: クラスを定義します。
  • クラス名: ここでは Animal という名前でクラスを作成しています。
  • 役割: クラスは、データ(プロパティ)と機能(メソッド)をまとめて扱う「設計図」です。

プロパティの宣言

public $name; // 動物の名前
public $type; // 動物の種類
  • public このプロパティが「外部からアクセス可能」であることを示します。詳細はLesson5-3で学びます。
  • $name$type 動物の名前と種類を保存する変数です。
  • プロパティの役割: クラス内で情報を保持するために使います。

メソッドの定義:情報を表示する機能

public function showInfo() {
    echo "名前: " . $this->name . PHP_EOL;
    echo "種類: " . $this->type . PHP_EOL;
}
  1. function メソッド(関数)を定義します。
  2. $this->name $this は現在のインスタンスを指します。
    -> 演算子: インスタンスのプロパティやメソッドにアクセスするために使います。
  3. echo 出力を行います。改行は PHP_EOL を使います。

メソッドの定義:鳴き声を出す機能

public function makeSound($sound) {
    echo $this->name . "は「" . $sound . "」と鳴きます。" . PHP_EOL;
}
  • 引数 $sound 鳴き声を外部から受け取ります。
  • 文字列の連結: . 演算子で文字列をつなげます。
  • 役割: インスタンスごとに異なる鳴き声を表示します。

インスタンスの作成と操作

$animal1 = new Animal();
$animal1->name = "ライオン";
$animal1->type = "肉食動物";
$animal1->showInfo();
$animal1->makeSound("ガオー");
  1. new Animal() クラスからオブジェクトを作成します。このプロセスを インスタンス化 と呼びます。
  2. プロパティの設定:
    • $animal1->name = "ライオン"; のように、プロパティに値を設定します。
  3. メソッドの呼び出し:
    • $animal1->showInfo(); のように、インスタンスのメソッドを呼び出します。

別のインスタンスの作成と操作

$animal2 = new Animal();
$animal2->name = "ゾウ";
$animal2->type = "草食動物";
$animal2->showInfo();
$animal2->makeSound("パオーン");
  • 複数のインスタンス: 同じクラスから異なるオブジェクトを作成できます。
  • 独立性: $animal1$animal2 は互いに独立したデータを保持します。
もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPHP学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました