ちと興味があるので。
…おねちゅ気味なので、本当に備忘録程度。
<?php class hoge { public function hoge() { echo 'hoge' , "\n"; } } $obj = new hoge();
<?php class hoge { public function __construct() { echo '__construct' , "\n"; } } $obj = new hoge();
うんそりゃそうだ。
<?php class hoge { public function __construct() { echo '__construct' , "\n"; } public function hoge() { echo 'hoge' , "\n"; } } $obj = new hoge();
なるほど。
バージョン依存かしらん? とか思って調べてみる。
http://www.php.net/manual/ja/language.oop5.decon.php
下位互換性を維持するため、PHP 5 が指定されたクラスの __construct() 関数をみつけられなくて、 かつそれが親クラスのコンストラクタを継承していない場合には、 古い形式のコンストラクタ関数、つまり、そのクラスの名前と同じ関数が探されます。 実際、互換性の問題が発生する可能性があるのは、 そのクラスが __construct() という名前のメソッドを 有しており、それが異なる用途で使用されている場合です。
「指定されたクラスの __construct() 関数をみつけられなくて、 かつそれが親クラスのコンストラクタを継承していない場合には、 古い形式のコンストラクタ関数、つまり、そのクラスの名前と同じ関数が探されます」あぁしっかり明記されてるわ。
一瞬、ふと。
んと…よくある「getInstance」とかのメソッドがあるような、いわゆる「Singletonとか」でやる「外からnewなんか、やらせねぇぜ?」なパターン、どうなるんだろ?
<?php class hoge { private function __construct() { echo '__construct' , "\n"; } public function hoge() { echo 'hoge' , "\n"; } } $obj = new hoge();
[gallu@localhost ~]$ php t.php
Fatal error: Call to private hoge::__construct() from invalid context in /home/gallu/t.php on line 19
あぁよしよし、ちゃんとエラーになる。
んじゃ次、もうちょいとだけ。
<?php class hoge { public function __construct() { echo '__construct' , "\n"; } public function hoge() { echo 'hoge' , "\n"; } } class foo extends hoge { public function foo() { echo 'foo' , "\n"; } } $obj = new hoge();
あぁこうくるかぁ確かにそりゃそうか。
古い形式の改修、結構手間かかりそうだなぁ。
すごく雑なのでいいから「古い形式のコンストラクタ使ってるかもしれない程度に怪しいブツを探す」バッチとか、組んでおくと、もしかしたら楽かしらん?
イメージとしては
・grep ぽいので classの文字引っかけて
・classの後に続くワードを取得して
・同一ファイル内で「function ワード」とかで荒っぽくひっかけて
くらい?
どっかにないかなぁ?w