【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【圧倒的 低コスト】Oracle Cloud 構築・運用保守・監視サービス

【9,800円/回】Webサイト自動診断サービス「クイックスキャナー」

【9,800円/回】Webサイト自動診断サービス「クイックスキャナー」

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【次世代】ゲーム専用データ分析エンジン『ThinkingEngine』

【次世代】ゲーム専用データ分析エンジン『ThinkingEngine』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【ECアプリ開発】Shopify カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【音声アプリ開発】Twilio カスタムアプリ開発サービス

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【グローバル対応】北米リージョン・クラウド / サーバー サポート

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【初心者向け】PHP の コンストラクタ について

こんにちは!
システム開発部の松木です。
今回は オブジェクト指向 の一つ、コンストラクタについて深く見ていこうと思います。

コンストラクタとは?

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

・通常のメソッド

$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;
        }
    }
}

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

コンストラクタで変数が初期化されることにより、新しく生成したインスタンスの変数に必ず指定した値が入っているということです。この機能によりオブジェクトごとの値を変数に持たせることができます。

まとめ

いかがでしたでしょうか。

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

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

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
5
読み込み中...
5 票, 平均: 1.00 / 15
1,269
facebook twitter はてなブックマーク
【大阪 / 横浜】インフラエンジニア / サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア / サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author