我想在一个类中多次重用一个功能.此功能依赖于一个私有变量:
trait Address { private $address; public function getAddress() { return $this->address; } public function setAddress($address) { $this->address = $address; } }
我发现到use the trait twice的唯一方法是:
class User { use Address { getAddress as getHomeAddress; setAddress as setHomeAddress; getAddress as getWorkAddress; setAddress as setWorkAddress; } }
问题是,通过这样做,私有变量$address在不同的方法之间共享,代码将无法正常工作:
$user = new User(); $user->setHomeAddress('21 Jump Street'); echo $user->getWorkAddress(); // 21 Jump Street
有没有解决方案真正使用trait两次,而不共享其私有变量?
声明使用trait将不会创建该trait的实例.特征基本上只是复制并粘贴到使用类中的代码.这将仅为该方法创建一个别名,例如它会添加类似的东西
public function getHomeAddress() { return $this->getAddress(); }
到你的用户类.但这仍然只是一个特点.不会有两个不同的$address属性,只有一个.
您可以使这些方法是私有的,然后通过__call通过switch / shell委托方法名称上的任何公共调用,并使用地址的数组,例如.
trait Address { private $address = array(); private function getAddress($type) { return $this->address[$type]; } private function setAddress($type,$address) { $this->address[$type] = $address; } public function __call($method,$args) { switch ($method) { case 'setHomeAddress': return $this->setAddress('home',$args[0]); // more cases … } } }
但这只是一个蠕虫病毒.