用一个处理两者的方法替换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。
答案 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;
}
}
我们在编程中做出的每一个选择都是妥协。诀窍是弄清楚你可以妥协的地方和不应该的地方。