如何将变量设为私有特征?

Ben*_*min 13 php oop traits

我想在一个类中多次重用一个功能.此功能依赖于私有变量:

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)

但那只是一堆蠕虫.

换句话说,你不能做三立你正在尝试与特点做.要么使用两种不同的特征.或者使用旧的聚合并添加具体的代理方法.

  • 虽然我知道traits没有被*实例化*,但我仍然期望它们的私有变量对于使用它们的类是不可见的,因此可能允许在单个类中多次使用它们,并使用别名方法名称.看起来我错了,谢谢你的回答! (3认同)