gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

コンストラクタ系の実験

ちと興味があるので。
…おねちゅ気味なので、本当に備忘録程度。

<?php

class hoge {
  public function hoge() {
    echo 'hoge' , "\n";
  }
}

$obj = new hoge();

[gallu@localhost ~]$ php t.php
hoge

<?php

class hoge {
  public function __construct() {
    echo '__construct' , "\n";
  }
}

$obj = new hoge();

[gallu@localhost ~]$ php t.php
__construct

うんそりゃそうだ。

<?php

class hoge {
  public function __construct() {
    echo '__construct' , "\n";
  }

  public function hoge() {
    echo 'hoge' , "\n";
  }
}

$obj = new hoge();

[gallu@localhost ~]$ php t.php
__construct

なるほど。
バージョン依存かしらん? とか思って調べてみる。


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();

[gallu@localhost ~]$ php t.php
__construct

あぁこうくるかぁ確かにそりゃそうか。


古い形式の改修、結構手間かかりそうだなぁ。
すごく雑なのでいいから「古い形式のコンストラクタ使ってるかもしれない程度に怪しいブツを探す」バッチとか、組んでおくと、もしかしたら楽かしらん?
イメージとしては
grep ぽいので classの文字引っかけて
・classの後に続くワードを取得して
・同一ファイル内で「function ワード」とかで荒っぽくひっかけて
くらい?


どっかにないかなぁ?w