Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【PHP】extendsしているクラスで__construct()をオーバーライドする場合

挙動として予想外だったので、メモ。

親クラスを継承するクラスにおいて__construct()をオーバーライドしている場合。

    class SuperClass {
        private $name;
        
        function __construct() {
            $this->name = 'John Doe';
        }
    }
    
    class SubClass extends SuperClass {
        private $gender;
        
        function __construct() {
            $this->gender = 'male';
        }
        
        function say_my_name() {
            echo $this->name;
        }
    }

上記のような場合、SubClassのインスタンスは$nameプロパティを持ちますが、say_my_name()メソッドは'John Doe'を出力しません。
SuperClassにおいて__construct()をオーバーライドし、かつSubClassでさらに__construct()をオーバーライドする場合、SubClassの__construct()において明示的にSuperClassの__construct()を実行してやらないといけないようです。

以下のように変更したら、期待通りの結果が得られるようになりました。

    class SuperClass {
        private $name;
        
        function __construct() {
            $this->name = 'John Doe';
        }
    }
    
    class SubClass extends SuperClass {
        private $gender;
        
        function __construct() {
            parent::__construct(); //明示的にSuperClassの__construct()を実行。
            $this->gender = 'male';
        }
        
        function say_my_name() {
            echo $this->name;
        }
    }

クラスに対する理解の甘さが露呈しました。 お恥ずかしい限り。
ということで、忘れないようにメモ。