Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据持有者应该具有什么可见性?_Php_Design Patterns - Fatal编程技术网

Php 数据持有者应该具有什么可见性?

Php 数据持有者应该具有什么可见性?,php,design-patterns,Php,Design Patterns,我想知道在使用数据映射模式时,什么样的可见性可以提供最佳实践 私人/公共/受保护 受保护时,我需要在映射器类的save()方法中使用getters() 如果是私有的和公共的,我可以做$user->id;在mapper类中。什么最有意义?在我看来,我经常这样使用它,属性受到保护,我的类使用神奇的方法来获取和设置。我这样做,你两样都能做到。关于使用setter-方法,我最喜欢的是使用流畅的接口 /** * Handling non existing getters and setters *

我想知道在使用数据映射模式时,什么样的可见性可以提供最佳实践

私人/公共/受保护

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


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

在我看来,我经常这样使用它,属性受到保护,我的类使用神奇的方法来获取和设置。我这样做,你两样都能做到。关于使用
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);
}
使用fluent界面如下所示:

$post->setTitle('New Post')
     ->setBody('This is my answer on stackoverflow.com');
关于单一可能性的一些想法:

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

公开的 将无法截获对变量的更改。有时需要在设置上做一些事情

受保护的 对我来说最好的方法。属性是不可公开更改的,我强制其他开发人员为其具有附加功能的属性编写getter和setter。在我看来,这样可以防止其他人在误用模型类时犯错误