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
一覧
この記事に対するトラックバックはまだありません。

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