こんにちは!
システム開発部の松木です。

今回はオブジェクト指向の一つ、コンストラクタについて深く見ていこうと思います。

コンストラクタとは?

コンストラクタは、クラスをインスタンス化(オブジェクト化)した時に必ず実行されるメソッドです。

通常のメソッドはクラスをインスタンス化した後にアロー演算子を用いて任意のタイミングで呼び出すことができるが、コンストラクタはインスタンス化するタイミングで自動的に呼び出されるため呼び出す工程がありません。

・通常のメソッド
$object = new クラス名;

$object->メソッド名();
・コンストラクタメソッド
$object = new クラス名;

コンストラクタの書き方

コンストラクタメソッドは下記のように記述を行います。
public function __construct() {
    // 処理内容
}
最初にpublicと記述されていますが、こちらはアクセス修飾子の一つです。
アクセス修飾子にはpublic, protected, privateとありますが、
publicにしておかないと外部からクラスを呼び出したときにコンストラクタメソッドが呼び出されなくなる為、

基本的にはpublicのアクセス修飾子を使用します。

また、メソッド名の前に「__」とアンダースコアが2つ並んでいるメソッドをマジックメソッドと言います。
マジックメソッドは特殊な状況で呼ばれるメソッドでコンストラクタ以外にも「__get」「__set」があります。

脱線しましたが、コンストラクタは上記のように記述し使用することができます。

使用例

ここからは実際に使用し、イメージを定着させていきましょう。
まずはクラスを作成します。
今回は人間のクラス、Humanクラスを作成していきます。
class Human
{
    private $name;
    private $age;
    private $from;

    public function __construct(
        $name,
        $age,
        $from = 'Japan'
    ) {
        $this->name = $name;
        $this->age = $age;
        $this->from = $from;
    }
}
人間のクラスを作成するので必要なプロパティ(変数)として「名前、年齢、出身」を用意しています。
このクラスを呼び出す時はコンストラクタの引数で指定した数をインスタンス作成時の引数に入れる必要があります。
$human = new Human('taro', 32);
上記の書き方をすることで、コンストラクタに必要な値を渡しHumanクラスをインスタンス化することができました。$humanにはHumanクラスが格納されています。

ここで、一つ疑問が生まれます。

「コンストラクタの引数は3つ存在するのに、インスタンス化する時は2つしか指定していないのになぜ作成できるの?」

という疑問です。

こちらですが、コンストラクタの中身をよく見てみると、3つ目の引数$fromにJapanという値が入れられています。
このようにコンストラクタだったりPHPのメソッド全般では、何も受け取らなかった場合にはこの値を入れるといった初期値を決めることができます。

値を受け取った場合には受け取った値が代入され初期値は呼び出されません。

次になぜ変数にprivateを指定しているのかについてですが、
こちらについては、外側から直接変更させることを禁止しているからです。

このような書き方をカプセル化といいます。

では、外側から直接変更することの何がいけないのか
こちらについては、例えば、年齢の変数$ageには200歳までの値しか入れたくないというときに
直接変更を可能にしていると、201歳以降の値も入れることができてしまいます。

なので、カプセル化を行い必ずメソッド等を経由し、不正な値かを判断する条件等で確認を行ってから、変数に代入する形を使用しています。

今回の場合はsetメソッドを用意し、setメソッド内で判定式を記述しております。
そのsetメソッドをコンストラクタで呼び出すことで、Humanクラスをインスタンス化したときに、
setAge()が呼び出され$ageに入る値を制限させています。
下記の記述例では201以上の値を受け取った時は強制的に200が入るようにしております。
class Human
{
    private $name;
    private $age;
    private $from;
    public function __construct(
        $name,
        $age,
        $from = 'Japan'
    ) {
        $this->name = $name;
        $this->setAge($age);
        $this->from = $from;
    }

  public function setAge($age) {
        if ($age <= 200) {
            $this->age = $age;
        } else {
            $this->age = 200;
        }
    }
}

コンストラクタを使用するにあたってのメリット

コンストラクタで変数が初期化されることにより、新しく生成したインスタンスの変数に必ず指定した値が入っているということです。

この機能によりオブジェクトごとの値を変数に持たせることができます。

まとめ

いかがでしたでしょうか。
今回はコンストラクタに焦点を当てお話をしましたが、
オブジェクト指向では他にも学ぶことがたくさんあるので

これからも勉強を続けていきましょう!

今回のブログは以上です。
最後までお読みいただきありがとうございました。