数据持有者应具备哪些可见性?

时间:2012-12-08 18:17:49

标签: php design-patterns

我想知道什么可见性会给出使用数据映射模式的最佳实践?

私人/公共/受保护的

受保护时,我需要在mapper类的save()方法中使用getters()。

如果私人和公众我可以做$ user-> id;在mapper类中。最有意义的是什么?

1 个答案:

答案 0 :(得分:0)

在我看来,我经常以这种方式使用它,属性受到保护,我的类使用魔术方法获取getter和setter。我这样做你可以做到这两点。我喜欢使用setter - 方法的最佳方法是使用流畅的接口。

/**
 * Handling non existing getters and setters
 *
 * @param string $name
 * @param array $arguments
 * @throws Exception
 */
public function __call($name, $arguments)
{
    $type = substr($name, 0, 3);

    // Check if this is a getter or setter
    if (in_array($type, array('get', 'set'))) {
        $property = lcfirst(substr($name, 3));

        // Only if the property exists we can go on
        if (property_exists($this, $property)) {
            switch ($type) {
                case 'get':
                    return $this->$property;
                    break;

                case 'set':
                    $this->$property = $arguments[0];
                    return $this;
                    break;
            }
        } else {
            throw new \Exception('Unknown property "' . $property . '"');
        }
    } else {
        throw new Exception('Unknown method "' . $name . '"');
    }
}

/**
 * Magic Method for getters
 *
 * @param string $name
 * @return mixed
 */
public function __get($name)
{
    $method = 'get' . ucfirst($name);
    return $this->$method();
}

/**
 * Magic Method for setters
 *
 * @param string $name
 * @param mixed $value
 */
public function __set($name, $value)
{
    $method = 'set' . ucfirst($name);
    return $this->$method($value);
}

使用流畅的界面如下所示:

$post->setTitle('New Post')
     ->setBody('This is my answer on stackoverflow.com');

关于单一可能性的一些想法:

私人

使用私有属性会阻止我扩展我的模型类并重用某些功能。

公共

无法拦截变量的变化。有时需要在设置上做一些事情。

受保护的

对我来说最好的方式。这些属性不是可公开更改的,我强迫其他开发人员为其属性编写getter和setter,这些属性具有其他功能。另外在我看来,这样可以防止他人在滥用你的模型类时犯错误。