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

标签 php oop traits

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

相关文章:

python - TabularAdapter 列的不同格式?

php - 如何使用 Symfony 控制台识别是否提供了没有值的选项?

Java 类层次结构

Java OOP 实例化自身还是添加子类?

java - 在java oop中创建多个对象

forms - 交响乐 3 : Build forms for entities based on Traits

php - 查找接下来的 13 个星期一和最后一个星期一

php - 简单的 DOM file_get_html 不返回任何内容

php - 根据 Eloquent 模型中的值使用 2 个不同的列

php - 在 symfony 中动态扩展用户实体