php – 如何使变量私有的特征?

前端之家收集整理的这篇文章主要介绍了php – 如何使变量私有的特征?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在一个类中多次重用一个功能.此功能依赖于一个私有变量:
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;
    }
}

问题是,通过这样做,私有变量$address在不同的方法之间共享,代码将无法正常工作:

$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street

有没有解决方案真正使用trait两次,而不共享其私有变量?

声明使用trait将不会创建该trait的实例.特征基本上只是复制并粘贴到使用类中的代码.这将仅为该方法创建一个别名,例如它会添加类似的东西
public function getHomeAddress()
{
    return $this->getAddress();
}

到你的用户类.但这仍然只是一个特点.不会有两个不同的$address属性,只有一个.

您可以使这些方法是私有的,然后通过__call通过switch / shell委托方法名称上的任何公共调用,并使用地址的数组,例如.

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相关文章