1

用一个处理两者的方法替换 getter 和/或 setter 方法是个好主意吗?

例如:

    function name($what = null){

      if(!$what)
        return $this->name;

      $this->name = $what;
    }

像这样使用:

    // get name
    print $obj->name();

    // set name
    $obj->name('bla');

我已经看到一些框架做到了。社区认为这是一种好的做法还是坏的做法?:P

它看起来效率更高,但看起来有点混乱,因为我习惯于 PHP 中的 getThing() 和 setThing()。这种风格让我想起了 jQuery。

4

5 回答 5

7

用一个处理两者的方法替换 getter 和/或 setter 方法是个好主意吗?

不。

也许对于一个非常具体的用例。但不是。如果您需要分配null$name. 您的代码不允许这样做。

性能而言,我不知道如何最后,您仍然进行一个方法调用。设置或获取_

如果您的意思是在更少的代码中高效,那么就您自己的观点而言,您已经牺牲了可读性。哪个效率更低。特别是随着时间的推移。

于 2012-11-15T12:35:38.673 回答
2

一般来说,有一个函数一次返回一些东西,另一次设置一些东西并返回 void,从来都不是一个好主意(可读性和 findbug 原因)

于 2012-11-15T12:53:55.330 回答
2

我也使用过类似 jQuery 的单一方法解决方案,并且确实喜欢它,但阅读了一些帖子,出于某种原因,我认为其他人认为这是不好的做法。但是现在我再次阅读并遇到了这篇文章。

我的解决方案有(免责声明:压缩格式)

class Person {
    protected $name;
    protected $age;
    public function name($value = null) {
        if (null !== $value) {
            $this->name = (string) $value;
            return $this;
        }
        return $this->name;
    }
    public function age($value = null) {
        if (null !== $value) {
            $this->age = (int) $value;
            return $this;
        }
        return $this->age;
    }
}

我确实喜欢这种类型的课堂界面

$person1 = new Person();
$person1->name('Bob')->age(30);
echo $person->name();

一般的想法是,如果 $value 为 null 然后发回属性,否则将属性设置为 $value,可能是类型转换它或通过一些其他过滤器运行它,然后返回类的实例。

现在我正在重新访问它,我不确定为什么这会如此糟糕,除非您可能会将您的 IDE 与返回值混淆,因为它要么是您的属性数据类型,要么是您的类。

需要将值设置为 false 仍然可以在这里工作,在(对我而言)需要设置为 null 的边缘情况下,我只需一次性/逐个更改默认/条件检查以适应。

我确实很欣赏不必编写两个方法及其相关的 phpdoc 块的较少样板感觉。

于 2013-01-04T16:00:18.693 回答
1

您可以做的是为对象中的所有变量创建一个Get一个Set

所以代替函数 getName() 和 getAge()

您可以使用 get('name') 或 set('name', 'Foo Bar');

函数如下所示:

    public function __set($name, $value) {
    $method = 'set' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    $this->$method($value);
}

public function __get($name) {
    $method = 'get' . $name;
    if (('mapper' == $name) || !method_exists($this, $method)) {
        throw new Exception('Invalid Client property');
    }
    return $this->$method();
}

如果您正在寻找一种有效的替代方法来替代 getter 和 setter,那么它可能就是这样。

于 2012-11-15T12:41:46.393 回答
0

我通常喜欢让使用我的代码的程序员在通过 __set() 和 __get() 直接访问受保护的变量和通过我的自定义 getter/setter 之间进行选择。我发现在我的 getter/setter 中使用 func_num_args() 是一个可以接受的解决方案。它比仅测试 null 稍慢,但允许我将值设置为 null。

/**
 * Getter/Setter for Class::$someVar.
 * 
 * @access public 
 * @param mixed Value for Class::$someVar to be set to.
 * @return mixed If no parameter are passed it returns the current value for Class::$var.
 */
public function someVar($value = null) {
    if (func_num_args() > 0) {
        $this->someVar = $value;
        return $this;
    } else {
        return $this->someVar;
    }
}

我们在编程中做出的每一个选择都是一种妥协。诀窍是找出可以妥协的地方和不应该妥协的地方。

于 2013-06-06T19:00:33.670 回答