LoginSignup
0
0

More than 3 years have passed since last update.

PHP コンストラクタの検証

Posted at

1.constractの挙動

コンストラクタメソッドはよく使います。
個人的には『一番最初に呼ばれるメソッド』というざっくりした印象でした。
調べたところ、インスタンス化した段階で呼ばれます。

ではまず、シンプルなコードで試してみましょう。

test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();

?>
classTest.php
<?php

class classTest
{
    public function __construct(){
        echo 'constructメッセージ';
    }

}

?>
・実行結果
constructメッセージ

2.コンストラクタを親・子クラスで書いたら

では、親クラスのコンストラクタが呼ばれるか、
子クラスのコンストラクタが呼ばれるか
見ていきましょう。

test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new childClass();

?>
classTest.php
<?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.親クラスコンストラクタを呼びたい

では、公式ドキュメントの通りにコンストラクタの中で
親クラスのコンストラクタを呼んでみましょう。

test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new childClass();

?>
classTest.php
<?php

class classTest
{
    public function __construct(){
        echo '親メッセージ';
    }

}


class childClass extends classTest
{
    public function __construct(){
        parent::__construct();
    }

}

?>
・実行結果
親メッセージ

これで親クラスのコンストラクタが呼ばれるようになりました。

ちなみに、この場合でも親クラスのコンストラクタが呼ばれます。

classTest.php
class childClass extends classTest
{

}

4.コンストラクタの変数を保存

うまいタイトルが思いつきませんでしたが、コンストラクタで呼ばれた変数は
その後に別のメソッドで使用可能です。

classTest.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new classTest();

$app->message();

?>
classTest.php
class classTest
{
    private $message;

    public function __construct(){
        $this->$message = 'メッセージ';
    }

    public function message(){
        echo $this->$message;
    }

}

?>
・実行結果
メッセージ

では、子クラスでも使えるのか見ていきましょう。

classTest.php
<?php

require_once(__DIR__ . '/classTest.php');

$app = new childClass();

$app->message();

?>
classTest.php
class classTest
{
    private $message;

    public function __construct(){
        $this->$message = 'メッセージ';
    }

}

class childClass extends classTest
{
    public function message(){
        echo $this->$message;
    }
}

?>
・実行結果
メッセージ

いけました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0