バカンス駆動開発

この前バカンスって言ったら「古っ」って言われました

PHPのサブクラスでコンストラクタを書くときにはまった話

PHPでサブクラス内でコンストラクタを書くときの注意点はマニュアルに書いてあります。まずはそちらを引用。

PHP: コンストラクタとデストラクタ - Manual

注意: 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。 親クラスのコンストラクタを実行するには、子クラスのコンストラクタの 中で parent::__construct() をコールすることが 必要です。 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承します (ただし、private 宣言されている場合は除く)。 これは、通常のクラスメソッドと同様です。

<?php
class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

はまったコード

<?php
class BaseClass {
   function __construct($value) {  //インスタンス時に引数を取る
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
      //空っぽ
   }
}

PHPマニュアルと変わった所はコメント部分の箇所、親クラスのコンストラクタが引数を取るところと、子クラスのコンストラクタが空っぽというところ。

なんで子クラスのコンストラクタが空っぽなのかというと、なんか入れようとして放置してただけなんですが、そのせいでえらい目に会いました。ありがとうございました。

空にしてるから何も影響しないと思ってました。そう思うことは自然の摂理だと思います。でもわざわざ(空とはいえ)コンストラクタを定義してしまっているので親クラスのコンストラクタがオーバーライドされてしまったという話でした。

コンストラクタもオーバーライドされるとは盲点だったぜ。