我想在一个类中多次重用某个功能。此功能依赖于私有变量:
trait Address {
private $address;
public function getAddress() {
return $this->address;
}
public function setAddress($address) {
$this->address = $address;
}
}
我发现的唯一方法使用该特质两次 https://stackoverflow.com/questions/13582061/how-to-use-a-trait-several-times-in-a-class,如下:
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
有没有一种解决方案可以真正使用该特征两次,而不共享其私有变量?
声明一个特质use
不会创建该特征的实例。 Traits 基本上只是复制并粘贴到 using 类中的代码。这as
只会为该方法创建一个别名,例如它会添加类似的东西
public function getHomeAddress()
{
return $this->getAddress();
}
到你的用户类。但这仍然只是这一特征。不会有两个不同的$address
属性,但只有一个。
您可以将这些方法设为私有,然后将任何公共调用委托给它__call
通过对方法名称进行开关/大小写并使用数组作为地址,例如
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 …
}
}
}
但这只是一堆蠕虫。
换句话说,你无法理智地用特质做你想做的事情。要么使用两个不同的特征。或者使用好的旧聚合并添加具体的代理方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)