【PHP】Lesson5-2:コンストラクタを理解しよう

ながみえ

一つ前のレッスンでは クラスの定義とインスタンス生成 について学習しました。

今回は コンストラクタ について見ていきましょう。

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でクラスを使いこなすためには、「コンストラクタ」の仕組みを理解することが大切です。

コンストラクタはオブジェクト生成時に自動的に実行される特別なメソッドで、プロパティの初期化や設定などを効率よく行うことができます。

本記事ではコンストラクタの基本的な役割や使い方、__constructメソッドの具体例まで、初心者にも分かりやすく解説します。

コンストラクタとは何か?|初期化メソッドを理解しよう

コンストラクタ とは、クラスのインスタンス生成時に自動的に呼び出される特殊なメソッドです。

主に以下の目的で使用されます:

  • 初期化処理:オブジェクトの初期状態を設定します。
  • 依存関係の注入:必要なデータや設定値をオブジェクトに与えます。

PHPでは、コンストラクタは __construct という名前で定義されます。

このメソッドをクラスに定義することで、インスタンス生成時に自動的に実行されるコードを指定できます。

例えば、コンストラクタを実装した以下のコードを見てみましょう。

class Sample {						// Sampleクラスの定義
    public function __construct() {	// Sampleクラスのコンストラクタの定義
        echo "コンストラクタが呼び出されました。" . PHP_EOL; // コンストラクタの処理内容
    }
}

$sample = new Sample();	// インスタンス生成

コンストラクタは、直接呼び出さなくてもインスタンス生成した時点で実行されます。

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

コンストラクタが呼び出されました。

引数付きコンストラクタの使い方|柔軟な初期化処理を実装しよう

コンストラクタはメソッド(≒関数)なので、引数を持つことができます。

引数を持つコンストラクタの例と使い方を2つ紹介します。

初期値を与えるコンストラクタの使い方

コンストラクタの使用用途一つとして、プロパティの値に初期値を与える(初期化する)ことがあげられます。

以下はプロパティを初期化するコンストラクタを実装したコードの例です。

<?php
class User {		// Userクラスの定義
    public $name;	// Userクラスのプロパティ
    public function __construct($var) { // 引数を持つコンストラクタを定義
        $this->name = $var;	// $thisは自分自身を指す。この場合は$nameのこと。
        //すなわち、このコンストラクタによりプロパティ$nameに引数$varの値が格納される
    }
    public function greet() { // 通常のメソッドを定義
        echo "こんにちは、" . $this->name . "さん!" . PHP_EOL;
    }
}

// インスタンス生成と初期値設定
$user1 = new User("太郎");  // Userクラスに引数「太郎」を渡してインスタンス生成
$user1->greet();			// 変数$use1rの中のgreet()メソッドの呼び出し
$user2 = new User("花子");  // Userクラスに引数「花子」を渡してインスタンス生成
$user2->greet();			// 変数$user2の中のgreet()メソッドの呼び出し
  • コンストラクタは $var を引数として受け取ります。
  • $this->name は、現在のインスタンスのプロパティ name にアクセスします。
  • インスタンスを生成すると、名前が自動的に設定(初期化)されます。

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

こんにちは、太郎さん!
こんにちは、花子さん!

デフォルト引数を使った柔軟な初期化方法

通常の関数と同様に、コンストラクタはデフォルト引数を設定することができます。

以下はそのコード例です。

class Product {		// Productクラスの定義
    public $name;
    public $price;

    // 二つのデフォルト引数を持つコンストラクタの定義
    public function __construct($name = "未設定", $price = 0) {
        $this->name = $name;
        $this->price = $price;
    }
    public function showInfo() {	// 通常のメソッドの定義
        echo "商品名: " . $this->name . PHP_EOL;
        echo "価格: " . $this->price . "円" . PHP_EOL;
    }
}

// 引数を指定せずにインスタンス化
$product1 = new Product();
$product1->showInfo();

// 引数を指定してインスタンス化
$product2 = new Product("ノート", 500);
$product2->showInfo();

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

商品名: 未設定  
価格: 0円  
商品名: ノート  
価格: 500円
  • デフォルト引数を指定することで、値が与えられなくてもインスタンス生成が可能になります。
  • デフォルト引数はオプション引数とも言い、これを使うことで柔軟性の高い設計ができます。

まとめ|初期化処理と活用方法を再確認しよう

ここまででコンストラクタの基本的な役割から、引数を活用した柔軟な初期化方法まで学習しました。

これによりクラスのインスタンスを生成するときに自動でプロパティを初期化したり、さまざまな値でオブジェクトを柔軟に生成できるようになりました。

今回身につけた知識は実践的なプログラム設計や、今後学ぶクラスの拡張・応用にも大いに役立ちます。

ぜひ次のステップにもチャレンジして、PHPのオブジェクト指向を着実にマスターしていきましょう!

演習問題|コンストラクタを使って自己紹介プログラムを作ろう

PHPでクラスとコンストラクタの使い方を学ぶプログラムを作成しましょう。

このプログラムでは名前と年齢を初期化し、自己紹介する機能を実装します。

コンストラクタを使ってデータを設定し、クラス内でその情報を表示するメソッドを作成します。

この演習の要件

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

  • クラス名は「Person」とすること。
  • プロパティとして「名前」と「年齢」を宣言し、それぞれ初期化できるようにすること。
  • コンストラクタを使って、名前と年齢を初期化できるようにすること。
  • introduceメソッドを作成し、名前と年齢を以下の形式で表示すること:
    名前: ○○
    年齢: ○○歳
  • インスタンスを2つ作成し、それぞれ異なる名前と年齢で初期化すること。
  • 各インスタンスから自己紹介メソッドを呼び出して、情報を表示すること。

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

名前: 太郎
年齢: 25歳
名前: 花子
年齢: 22歳

解き方のヒント

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

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

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

1:PHPのコード開始宣言
2:クラス「Person」の定義開始
  □ プロパティ「name」をpublicで宣言(名前を格納)
  □ プロパティ「age」をpublicで宣言(年齢を格納)
  □ コンストラクタ「__construct」の定義開始
  □ □ 引数「$name」と「$age」を受け取る
  □ □ プロパティ「name」に引数「$name」を代入
  □ □ プロパティ「age」に引数「$age」を代入
  □ コンストラクタの定義終了
  □ メソッド「introduce」の定義開始
  □ □ プロパティ「name」を表示
  □ □ プロパティ「age」を表示し、「歳」を追加
  □ メソッド「introduce」の定義終了
3:インスタンス「$person1」を作成し、「太郎」と25歳で初期化
4:インスタンス「$person2」を作成し、「花子」と22歳で初期化
5:インスタンス「$person1」の「introduce」メソッドを呼び出す
6:インスタンス「$person2」の「introduce」メソッドを呼び出す

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

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

<?php
// クラス「Person」を定義
class Person {
    // プロパティを定義
    public $name;  // 名前を格納するプロパティ
    public $age;   // 年齢を格納するプロパティ

    // コンストラクタの定義
    /* 【穴埋め問題1】
       ここでコンストラクタを定義し、名前と年齢を初期化するコードを書いてください。
    */

    // 情報を表示するメソッド
    public function introduce() {
        // 名前と年齢を出力
        echo "名前: " . $this->name . PHP_EOL;
        echo "年齢: " . $this->age . "歳" . PHP_EOL;
    }
}

// インスタンスを作成し、コンストラクタで初期化する
/* 【穴埋め問題2】
   ここでインスタンス「$person1」を作成し、「太郎」と25歳で初期化するコードを書いてください。
*/

/* 【穴埋め問題3】
   ここでインスタンス「$person2」を作成し、「花子」と22歳で初期化するコードを書いてください。
*/

// 情報を表示するメソッドを呼び出す
/* 【穴埋め問題4】
   ここで「$person1」のintroduceメソッドを呼び出すコードを書いてください。
*/

/* 【穴埋め問題5】
   ここで「$person2」のintroduceメソッドを呼び出すコードを書いてください。
*/

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

演習問題の答え合わせ

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

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

Q
正解コード
<?php
// クラス「Person」を定義
class Person {
    // プロパティを定義
    public $name;  // 名前を格納するプロパティ
    public $age;   // 年齢を格納するプロパティ

    // コンストラクタの定義
    // インスタンス生成時に名前と年齢を初期化する
    public function __construct($name, $age) {
        $this->name = $name; // プロパティ「name」に初期値をセット
        $this->age = $age;   // プロパティ「age」に初期値をセット
    }

    // 情報を表示するメソッド
    public function introduce() {
        // 名前と年齢を出力
        echo "名前: " . $this->name . PHP_EOL;
        echo "年齢: " . $this->age . "歳" . PHP_EOL;
    }
}

// インスタンスを作成し、コンストラクタで初期化する
$person1 = new Person("太郎", 25); // 「太郎」という名前と25歳で初期化
$person2 = new Person("花子", 22); // 「花子」という名前と22歳で初期化

// 情報を表示するメソッドを呼び出す
$person1->introduce();
$person2->introduce();
Q
正解コードの解説

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

クラスとプロパティの定義

class Person {
    public $name;  // 名前を格納するプロパティ
    public $age;   // 年齢を格納するプロパティ
}
  • class Person: PHPでクラスを定義しています。クラスは設計図のようなもので、オブジェクトを作るためのテンプレートです。
  • public $namepublic $age: クラス内で使う変数(プロパティ)を宣言しています。

コンストラクタの定義

public function __construct($name, $age) {
    $this->name = $name; // プロパティ「name」に初期値をセット
    $this->age = $age;   // プロパティ「age」に初期値をセット
}
  1. __construct: コンストラクタは、オブジェクトを作成するときに 自動的に実行される特別なメソッド です。
  2. 引数 $name$age: オブジェクト生成時に外部から渡されるデータを受け取ります。
  3. $this: 現在のインスタンス自身を指します。
    • 例: $this->name は、そのインスタンスの name プロパティにアクセスします。
  4. 初期化処理: 引数で受け取った値をプロパティに代入し、オブジェクトごとにデータを保持します。

メソッドの定義

public function introduce() {
    echo "名前: " . $this->name . PHP_EOL;
    echo "年齢: " . $this->age . "歳" . PHP_EOL;
}
  • introduce メソッド: 名前と年齢を画面に表示する処理を定義しています。
  • echo: 文字列を出力するPHPの基本的な命令です。
  • PHP_EOL: 改行コードを意味します。環境に依存せず正しい改行を行います。
  • 連結演算子 .: 文字列をつなげるために使われます。

インスタンスの生成

$person1 = new Person("太郎", 25);
$person2 = new Person("花子", 22);
  • new Person(): クラスからオブジェクトを作成します。このとき、コンストラクタが自動的に実行されます。
  • 引数 "太郎", 25"花子", 22: 名前と年齢を渡して初期化します。
  • インスタンスとは? クラスから作られた具体的なオブジェクトのことです。

メソッドの呼び出し

$person1->introduce();
$person2->introduce();
  • -> 演算子: インスタンスのプロパティやメソッドにアクセスするための演算子です。
  • introduce() の実行: 各インスタンスに設定された名前と年齢が表示されます。
もっと分かりやすい学習サイトにするために

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

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

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました