1.constractの挙動
コンストラクタメソッドはよく使います。
個人的には『一番最初に呼ばれるメソッド』というざっくりした印象でした。
調べたところ、インスタンス化した段階で呼ばれます。
ではまず、シンプルなコードで試してみましょう。
<?php
require_once(__DIR__ . '/classTest.php');
$app = new classTest();
?>
<?php
class classTest
{
public function __construct(){
echo 'constructメッセージ';
}
}
?>
・実行結果
constructメッセージ
2.コンストラクタを親・子クラスで書いたら
では、親クラスのコンストラクタが呼ばれるか、
子クラスのコンストラクタが呼ばれるか
見ていきましょう。
<?php
require_once(__DIR__ . '/classTest.php');
$app = new childClass();
?>
<?php
class classTest
{
public function __construct(){
echo '親メッセージ';
}
}
class childClass extends classTest
{
public function __construct(){
echo '子メッセージ';
}
}
?>
・実行結果
子メッセージ
この結果からわかるように、子クラスのコンストラクトが呼ばれます。
(多分、オーバーライドされてます)
親クラスのコンストラクタは呼ばれません。
実は公式ドキュメントに書いてありましたが、実際に実行しないと納得できないので実行しました。
https://www.php.net/manual/ja/language.oop5.decon.php
注意: 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。 親クラスのコンストラクタを実行するには、子クラスのコンストラクタの 中で parent::__construct() をコールすることが 必要です。 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承します (ただし、private 宣言されている場合は除く)。 これは、通常のクラスメソッドと同様です。
3.親クラスコンストラクタを呼びたい
では、公式ドキュメントの通りにコンストラクタの中で
親クラスのコンストラクタを呼んでみましょう。
<?php
require_once(__DIR__ . '/classTest.php');
$app = new childClass();
?>
<?php
class classTest
{
public function __construct(){
echo '親メッセージ';
}
}
class childClass extends classTest
{
public function __construct(){
parent::__construct();
}
}
?>
・実行結果
親メッセージ
これで親クラスのコンストラクタが呼ばれるようになりました。
ちなみに、この場合でも親クラスのコンストラクタが呼ばれます。
class childClass extends classTest
{
}
4.コンストラクタの変数を保存
うまいタイトルが思いつきませんでしたが、コンストラクタで呼ばれた変数は
その後に別のメソッドで使用可能です。
<?php
require_once(__DIR__ . '/classTest.php');
$app = new classTest();
$app->message();
?>
class classTest
{
private $message;
public function __construct(){
$this->$message = 'メッセージ';
}
public function message(){
echo $this->$message;
}
}
?>
・実行結果
メッセージ
では、子クラスでも使えるのか見ていきましょう。
<?php
require_once(__DIR__ . '/classTest.php');
$app = new childClass();
$app->message();
?>
class classTest
{
private $message;
public function __construct(){
$this->$message = 'メッセージ';
}
}
class childClass extends classTest
{
public function message(){
echo $this->$message;
}
}
?>
・実行結果
メッセージ
いけました。