PHPのサブクラスでコンストラクタを書くときにはまった話
PHPでサブクラス内でコンストラクタを書くときの注意点はマニュアルに書いてあります。まずはそちらを引用。
注意: 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。 親クラスのコンストラクタを実行するには、子クラスのコンストラクタの 中で 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マニュアルと変わった所はコメント部分の箇所、親クラスのコンストラクタが引数を取るところと、子クラスのコンストラクタが空っぽというところ。
なんで子クラスのコンストラクタが空っぽなのかというと、なんか入れようとして放置してただけなんですが、そのせいでえらい目に会いました。ありがとうございました。
空にしてるから何も影響しないと思ってました。そう思うことは自然の摂理だと思います。でもわざわざ(空とはいえ)コンストラクタを定義してしまっているので親クラスのコンストラクタがオーバーライドされてしまったという話でした。
コンストラクタもオーバーライドされるとは盲点だったぜ。