2016年3月13日 星期日

PHP decorator + __call

``` class Weapon { public function attack() { return 10; } } abstract class Decorator { protected $weapon; public function __construct($weapon) { $this->weapon = $weapon; } abstract public function attack(); public function __call($method, $parameters) { return call_user_func_array([$this->weapon, $method], $parameters); } } class ToxicDecorator extends Decorator { public function attack() { return $this->weapon->attack() + 15; } public function toxic() { echo 'toxic'; } } class LightingDecorator extends Decorator { public function attack() { return $this->weapon->attack() + 5; } public function lighting() { echo 'lighting'; } } $weapon = new Weapon(); $weapon = new ToxicDecorator($weapon); $weapon = new LightingDecorator($weapon); echo $weapon->attack(); echo $weapon->toxic(); echo $weapon->lighting(); // output // 30 // toxic // lighting ```