PHPはコンストラクタが2種類あるので、ファクトリメソッドの作り方を確認してみた。
#php4タイプのコンストラクタをprivateにする class Test{ private function Test(){} } var_dump( new Test() );#Fatal error:
#php5.xタイプのコンストラクタをprivateにする <?php class Test{ private function __construct(){} } var_dump( new Test() );#Fatal error:
class Test{
private function __construct(){}
public function Test(){}
}
var_dump( new Test() );
コンストラクタの呼び出し順が__construct優先なのでエラー
__constructが最優先なので、これをPrivate化することでOK。当たり前だけど。
__constructを開放すると・・・
class Test{
public function __construct(){}
private function Test(){}
}
var_dump( new Test() );#object(Test)#1 (0) {}
Factoryメソッドは、このように書くといいみたい
class Test{
private function __construct(){}
public static function factory(){
return new Test();
}
}
var_dump( new Test() );##Fatal error
var_dump( Test::factory() );#object(Test)#1 (0) {}
ほとんどJavaじゃん。
もう面倒なので、互換性チェックやめた。
PHP4系ではFactoryは規約だったけど、PHP5だとprivate仕様になるので。厳密なチェックが出来る。
でもタイプ量が増えてめんどくさい。