【初心者向け】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; } } }
・コンストラクタを使用するにあたってのメリット
コンストラクタで変数が初期化されることにより、新しく生成したインスタンスの変数に必ず指定した値が入っているということです。この機能によりオブジェクトごとの値を変数に持たせることができます。
まとめ
いかがでしたでしょうか。
今回はコンストラクタに焦点を当てお話をしましたが、オブジェクト指向では他にも学ぶことがたくさんあるので、これからも勉強を続けていきましょう!
今回のブログは以上です。
最後までお読みいただきありがとうございました。