gpt4 book ai didi

php - 如何使变量对特征私有(private)?

转载 作者:IT王子 更新时间:2023-10-29 00:11:22 25 4
gpt4 key购买 nike

我想在一个类中多次重复使用一个功能。此功能依赖于私有(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com