【PHP】Lesson5-2:コンストラクタの使い方と初期化処理をマスターしよう

tggaa478@yahoo.co.jp

オブジェクト指向プログラミングでは、クラスからインスタンス(オブジェクト)を作成する際に特別なメソッドが自動的に呼び出されることがあります。

これが コンストラクタ と呼ばれる機能です。

本記事では、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で自動実行される初期化メソッドを理解しよう

コンストラクタは、クラスからオブジェクトを生成するときに自動的に呼び出される特殊なメソッドです。

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

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

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

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

基本構文と使用例|PHPの__constructを実装しよう

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

// インスタンス生成時にコンストラクタが実行される
$sample = new Sample();

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

コンストラクタが呼び出されました。
  • クラス名は Sample です。
  • コンストラクタ __construct が定義されており、インスタンスを作成すると自動的に呼び出されます。
  • $sample = new Sample(); によりコンストラクタが実行され、メッセージが出力されます。

引数付きコンストラクタの応用|柔軟な初期化処理を実装する

初期値を与える__constructの使い方とは?

class User {       // Userクラスの定義
    public $name;  // Userクラスのプロパティ

    // コンストラクタで名前を初期化
    public function __construct($name) {
        $this->name = $name; //$thisは自分自身を指す。この場合は「User->name」と同じ
        //すなわち、このコンストラクタによりプロパティ$nameに引数"太郎"が格納される
    }

    public function greet() { // Userクラスのメソッド
        echo "こんにちは、" . $this->name . "さん!" . PHP_EOL;
    }
}

// インスタンス生成と初期値設定
$user = new User("太郎"); // Userクラスに引数"太郎"を渡してインスタンス生成
$user->greet();          // 変数$userの中のgreet()メソッドの呼び出し
  • コンストラクタは $name を引数として受け取ります。
  • $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のコンストラクタは、オブジェクトの初期化やデータ設定を自動化するために非常に便利です。

学習ポイントの整理:

  1. 基本構文__construct メソッドはインスタンス生成時に自動的に呼び出される。
  2. プロパティ設定 – 引数を受け取って $this を使ってプロパティに値を代入できる。
  3. デフォルト引数の活用 – 柔軟な初期設定を実現できる。

次回は「アクセス修飾子とカプセル化」について学習し、オブジェクトの安全性を向上させる方法を解説します!

演習問題|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の コンストラクタ を使ってクラスの初期化を自動化する方法を学びました。

コンストラクタを使うことで、インスタンス生成と同時にプロパティの初期設定が行えます。

  1. クラスとプロパティの定義方法を理解する。
  2. コンストラクタの基本構文と動作を学ぶ。
  3. $this を使ってインスタンス内のデータを操作する方法を覚える。

応用としてこのコードをもとに、趣味や住所などの情報を追加し、さらに詳細な自己紹介プログラムを作成してみましょう!

もっと分かりやすい学習サイトにするために

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

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

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました