我想在一个类中多次重用一个功能.此功能依赖于一个私有变量:
- 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 …
- }
- }
- }
但这只是一个蠕虫病毒.