それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ファクトリメソッドのテスト

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仕様になるので。厳密なチェックが出来る。
でもタイプ量が増えてめんどくさい。