Help us understand the problem. What is going on with this article?

PHP コンストラクタの検証

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

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

いけました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした