PHP Proxyパターンを楽に実装する
Proxyパターンは有用である。最近知ったから使ったことないけど。
例えば、以下、RobotクラスとMissileクラス。
ロボットクラスは、ミサイルの発射をミサイルクラスに委譲している。
<?php class Robot { function __construct() { $this->missile = new Missile(); } function launchMissile() { $this->missile->fire(); } } class Missile { public function fire() { echo '発射!'; } } $robot = new Robot(); $robot->launchMissile();
発射!
しかし、ただ発射するだけでは地味なので、おっぱいからミサイルを発射するように改造したとする。
<?php class Robot { function __construct() { $oppai = new Oppai(); $oppai->missile = new Missile(); $this->missile = $oppai; } function launchMissile() { $this->missile->fire(); } } class Oppai { public function fire() { echo 'おっぱいミサイル'; $this->missile->fire(); } }
おっぱいミサイル発射!
Missileクラスを一切触っていない。
実行元なる Robot::launchMissile にも一切手を加えていない。
このように、共通のインターフェイスを持つ中間層のクラスを差し込むことで、色々と応用を利かせることが出来る。
ただ、問題点がある。
Missileクラスが100個メソッドを持っていれば、Oppaiクラスにも同名のメソッドを100個用意する必要がある。
でも大丈夫。
<?php class Oppai { public function __call($name, $args) { echo '超おっぱいミサイル'; $this->missile->{$name}($args); } }
超おっぱいミサイル発射!
PHPには、__call() というマジックメソッド(と呼ばれる特殊なメソッド群)が存在する。
存在しないメソッド名が呼ばれると、この __call() が実行される。
これで、面倒なProxyパターンも気軽に使っていける。