使用单一方法设置/获取值而不是两个?

时间:2012-11-15 12:32:22

标签: php class coding-style getter-setter

用一个处理两者的方法替换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。

5 个答案:

答案 0 :(得分:7)

  

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

也许是针对一个非常具体的用例。但不是。如果您需要将null分配给$name,请在自己的代码中考虑。你的代码不允许这样做。

效率性能一样,我看不出如何。最后,您仍然可以进行一次方法调用。要么设置,要么获取

如果你的意思是效率,就像在更少的代码中一样,那么你已经牺牲了可读性。哪个效率更低。特别是随着时间的推移。

答案 1 :(得分:2)

您可以为对象中的 所有 变量创建获取设置。< / p>

因此,而不是函数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();
}

如果你正在寻找一种有效的替代吸气剂和制定者,可能就是这样。

答案 2 :(得分:2)

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

答案 3 :(得分: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,可以输入或者通过其他过滤器运行它然后返回类的实例。

现在我正在重新访问它,我不确定为什么这么糟糕 EXCEPT 因为你可能会将IDE与返回值混淆,因为它将是你的属性数据类型或者你的班级。

需要将值设置为false仍然可以在这里工作,在(对我来说)边缘情况下我需要设置为null然后我只会一次性/逐个更改默认/条件检查到容纳。

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

答案 4 :(得分: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;
    }
}

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