我想在一个类中多次重用一个功能.此功能依赖于私有变量:
trait Address {
private $address;
public function getAddress() {
return $this->address;
}
public function setAddress($address) {
$this->address = $address;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现两次使用特征的唯一方法如下:
class User {
use Address {
getAddress as getHomeAddress;
setAddress as setHomeAddress;
getAddress as getWorkAddress;
setAddress as setWorkAddress;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,通过这样做,私有变量$address
在不同的方法之间共享,并且代码将无法按预期工作:
$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street
Run Code Online (Sandbox Code Playgroud)
有没有一个解决方案真正使用特征两次,而不是共享其私有变量?
Gor*_*don 20
声明特征use
不会创建该特征的实例.特征基本上只是复制并粘贴到使用类中的代码.该as
只创建一个别名为方法,例如,它会添加类似
public function getHomeAddress()
{
return $this->getAddress();
}
Run Code Online (Sandbox Code Playgroud)
到您的用户类.但它仍然只是一个特征.不会有两个不同的$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 …
}
}
}
Run Code Online (Sandbox Code Playgroud)
但那只是一堆蠕虫.
换句话说,你不能做三立你正在尝试与特点做.要么使用两种不同的特征.或者使用旧的聚合并添加具体的代理方法.
归档时间: |
|
查看次数: |
15294 次 |
最近记录: |