我想在一个类中多次重复使用一个功能。此功能依赖于私有(private)变量:
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;
}
}
问题是,通过这样做,私有(private)变量 $address
被不同的方法共享,代码将无法按预期工作:
$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street
是否有真正使用该特征两次而不共享其私有(private)变量的解决方案?
最佳答案
使用 use
声明一个特征不会创建该特征的实例。特征基本上只是复制并粘贴到使用类中的代码。 as
只会为该方法创建一个别名,例如它会添加类似
public function getHomeAddress()
{
return $this->getAddress();
}
到你的用户类。但它仍然只是一个特征。不会有两个不同的 $address
属性,只有一个。
您可以将这些方法设为私有(private),然后通过 __call
将任何公共(public)调用委托(delegate)给它,方法是在方法名称上切换/套写并使用数组作为地址,例如
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 …
}
}
}
但这只是一堆蠕虫。
换句话说,你不能理智地做你想用特征做的事情。要么使用两个不同的特征。或者使用良好的旧聚合并添加具体的代理方法。
关于php - 如何使变量对特征私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582747/