昨日書いたこととか考えてるうちに、ふと思いついてやってみた。ていうか人を馬鹿にしたソースなので信じないように。
いわゆるテンプレートメソッドなんだけど、これはさらに強力です。SolidTemplateなら、子クラスに勝手なメソッドを定義させません!
堅牢なアーキテクチャの実現のためにどうだろう。
class HogeSolidTemplate {
protected static $methods = array(
'getHoge' ,
'getPiyo' ,
);
protected final function __construct($hoge , $piyo) {
$this->hoge = $hoge;
$this->piyo = $piyo;
}
public static function getInstance($class , $hoge , $piyo) {
$instance = new $class($hoge , $piyo);
return new Alias($self::methods , $instance);
}
}
↑このHogeSolidTemplateが親クラス。
これを継承したらnew禁止なのでgetInstanceでインスタンス生成する。生成時にクラス名を渡すというかっこ悪さだけど、ここではがまん。
けど、これが返すのは実は↓のインスタンス。
class Alias {
private $class;
private $methods = array();
public function __construct($methods , &$instance) {
$this->methods = $methods;
$this->class = &$instance;
}
public function __call($method , $args) {
if(in_array($method , $this->methods)) {
return call_user_func_array(array($this->class , $method) , $args);
} else {
die('許可されていないメソッドです');
}
}
}
宣言した以外のメソッドを呼ぶと、突然dieする(笑)。もうソースを荒らさせません!
わたしなら、こんなの使うといわれたら全力で反対するがなー。