【PHP】レッスン5-02:コンストラクタを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:コンストラクタ

この記事の練習問題を解くために必要な知識:
基礎文法・制御構造・関数・データ構造(レッスン1~4)クラスの定義と使用コンストラクタアクセス修飾子とカプセル化クラスメンバクラスの継承メソッドのオーバーライド抽象クラスインターフェーストレイト

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

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

本記事では、PHPのコンストラクタの基本的な使い方と応用例について詳しく解説します。

<<前のページ PHP記事一覧 次のページ>>

PHPのコンストラクタとは?

【初心者向け】PHPのオブジェクト指向を分かりやすくまとめた概念図。 特にクラスの継承、オーバーライド、抽象クラス、インターフェース、トレイトの関係性を視覚的に理解できるようまとめている。

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

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

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

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

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

コンストラクタの基本構文と使用例

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

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

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

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

パラメータ付きコンストラクタの応用

例1:初期値を設定するコンストラクタ

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 にアクセスします。
  • インスタンスを生成すると、名前が自動的に設定されます。

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

こんにちは、太郎さん!

例2:デフォルト引数を使う

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でクラスとコンストラクタの使い方を学ぶプログラムを作成しましょう。

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

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

この問題の要件

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

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

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

ヒント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」メソッドを呼び出す

ヒント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メソッドを呼び出すコードを書いてください。
*/

以上がこの問題の穴埋めコードです。

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



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

<?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();

正解コードの解説

今回のコードはPHPの コンストラクタ を使って名前と年齢を初期化し、それを表示するプログラムです。

このコードの詳細な動きを、ブロックごとに解説していきます。

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

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記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    PHPのテキスト&問題集トップへ戻る
    トップページへ戻る