PHP > Tips > PHPのコンストラクター

2006年01月31日

PHPのコンストラクターは自動的に基底クラスのコンストラクターを呼ばないと思い込んでた。

以下PHPのマニュアルより引用。
注意

PHP 3 および PHP 4のどちらでも派生クラスのコンストラクタから基底 クラスのコンストラクタを自動的にコールすることはできません。 上流のコンストラクタを適切にコールするように伝播させることは あなたの責任でやるべきことです。

これを見て自動的に呼ばないのか不便だな。
と思って、

class parentClass {
   function parentClass(){
      print 'コンストラクターがコールされました。';
   }
}

class childClass extends parentClass{
   function childClass(){
      parentClass::parentClass();
   }
}

長い間上記みたいに書いてたんだが、 今日たまたまマニュアルを見る機会があって見つけた部分、

同じくPHPマニュアルより

これは、PHP 4では次のように規則が修正されました。「コンストラクタ は、それが定義されているクラスと同じ名前の関数である」つまり、PHP 4では、クラスBが独自のコンストラクタ関数を持たない場合には、基底ク ラスのコンストラクタがコールされ、「Aのコンストラクタです<br>」 と出力されます。

うん!?派生クラスのコンストラクターが定義されてなかったら、 基底クラスのコンストラクターがコールされる!?

試しに以下のスクリプトを試してみると

class parentClass {
	function parentClass(){
		print 'parentClassのコンストラクター';
	}
}
class childClass extends parentClass{

}

$child =new childClass();

/*
実行結果

parentClassのコンストラクター
*/

目が点になった。

しっかり呼んでるじゃないか!

そらそうだ、学校でも子供が駄目なら親が呼ばれるし、親が駄目なら祖父母が呼ばれる。(いや、呼ばれないか)
PHPのOOPは変な仕様だなって思い込んでた。

マニュアルは子クラスのコンストラクターが定義されてたら、 自動的に親クラスのコンストラクターは呼ばないよって言いたかった訳だ。 子クラスに定義されてなかったら、親から呼ぶよってマニュアルは言ってる。

人の話をしっかり聞くと同時に人の文書もしっかり読まないとな。

蛇足だが、某IT企業がエンジニアを募集してて、それに応募した際にソースコードを提出したんだが、 そのソースのコメントに思いっきり、「PHPでは親コンストラクターが自動的に呼ばれないので・・・うんぬん」 みたいな事を書いていた。

恥ずかしい。
大きな勘違いだ。

某IT企業の方々へ
未熟者ですいません、しっかり勉強します。

posted by 37to at : 00:58 | コメント (0) | トラックバック (0)

コメント

この記事に対するコメントはまだありません。


投稿する

投稿者情報を保存しますか?


トラックバック

トラックバックURI


一覧

この記事に対するトラックバックはまだありません。