Php 使用单一方法设置/获取值,而不是使用两种方法?
将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗 例如:Php 使用单一方法设置/获取值,而不是使用两种方法?,php,class,coding-style,getter-setter,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('
function name($what = null){
if(!$what)
return $this->name;
$this->name = $what;
}
用法如下:
// get name
print $obj->name();
// set name
$obj->name('bla');
我见过一些框架这样做。社区认为这是好的做法还是坏的做法P
它看起来效率更高,但看起来有点混乱,因为我习惯于用PHP获取和设置。这种风格让我想起jQuery
将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗
没有
可能是一个非常具体的用例。但是,如果你需要将NULL指定为$NAMP,请在自己的代码中考虑。您的代码不允许这样做
就效率和性能而言,我看不出如何。最后,您仍然进行一次方法调用。设置或获取
如果您的意思是在更少的代码中实现高效,那么您已经牺牲了可读性。哪个效率更低。尤其是随着时间的推移
将getter和/或setter方法替换为处理这两种方法的单个方法是一个好主意吗
没有
可能是一个非常具体的用例。但是,如果你需要将NULL指定为$NAMP,请在自己的代码中考虑。您的代码不允许这样做
就效率和性能而言,我看不出如何。最后,您仍然进行一次方法调用。设置或获取
如果您的意思是在更少的代码中实现高效,那么您已经牺牲了可读性。哪个效率更低。尤其是随着时间的推移。您可以为对象中的所有变量创建一个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的方法,可能就是这样。您可以做的是为对象中的所有变量创建一个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的方法,可能就是这样。一般来说,使用一个函数,一次返回某个内容,另一次设置另一个内容,然后返回void,这永远都不是一个好主意可读性和findbug的原因,拥有一个函数,一次返回某个内容,另一次设置另一个内容并返回void,这从来都不是一个好主意可读性和findbug原因我也使用过类似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在这里仍然有效,在for me edge的情况下,我需要设置为null,然后我只需一次性/逐案更改默认/条件检查以适应
我确实很欣赏那种不必编写两个方法及其相关的phpdoc块的不那么典型的感觉。我也使用过类似于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在这里仍然有效,在for me edge的情况下,我需要设置为null,然后我只需一次性/逐案更改默认/条件检查以适应
我确实很欣赏那种不必编写两个方法及其相关的phpdoc块的不那么典型的感觉。我通常喜欢让使用我的代码的程序员在通过uu set和u get直接访问受保护变量和通过我的自定义getter/setter直接访问受保护变量之间做出选择。我发现在getter/setter中使用func_num_参数是可以接受的解决方案 . 它比只测试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;
}
}
我们在编程中所做的每一个选择都是一种妥协。诀窍是找出哪里可以妥协,哪里不应该妥协。我通常喜欢让使用我的代码的程序员在通过uu set和u get直接访问受保护变量和通过我的自定义getter/setter直接访问受保护变量之间做出选择。我发现在getter/setter中使用func_num_参数是可以接受的解决方案。它比只测试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;
}
}
我们在编程中所做的每一个选择都是一种妥协。诀窍是找出哪里可以妥协,哪里不应该妥协。如果我想将var设置为false或null?你是对的,这非常令人困惑,而且违反直觉。我希望PHP能提供类似properties的东西。jQuery正是它模仿的东西。显然,许多编码人员很容易被双用途访问器方法弄糊涂。但在某些情况下,它有助于API的可用性,这在流畅的接口中很常见。相对于应该不存在的浅层getter和setter,它更可取。@mario-Fluent接口,据我所知,总是返回一个值,您可以信赖它。上面示例中令人困惑的部分是,函数可能返回值,也可能不返回值,这只会带来麻烦。如果我想将var设置为false或null?你是对的,这非常令人困惑,而且违反直觉。我希望PHP能提供类似properties的东西。jQuery正是它模仿的东西。显然,许多编码人员很容易被双用途访问器方法弄糊涂。但在某些情况下,它有助于API的可用性,这在流畅的接口中很常见。相对于应该不存在的浅层getter和setter,它更可取。@mario-Fluent接口,据我所知,总是返回一个值,您可以信赖它。上面示例中令人困惑的部分是,函数可能返回值,也可能不返回值,这只会带来麻烦。我会采用这种方法实现getter和settings,最大的优点是这样做可以强制对象只具有您想要的属性。如果有人真的输入了一个错误,并为一些不应该存在的属性赋值,你的代码就会告诉你错误!帮助你抓住你的打字错误@JASONCCREARY确实是这样,尽管获得对您正在做的事情的直接反馈通常更可取。@bkwint,所以在开发中启用显示错误。虽然魔术方法确实有用,但使用它们来识别拼写错误是我今天听到的最愚蠢的事情。@JasonMcCreary,这是一个很好的副作用,仅此而已。我会选择这种实现getter和settings的方法,最大的优点是这样做可以强制对象只具有您想要的属性。如果有人真的输入了一个错误,并为一些不应该存在的属性赋值,你的代码就会告诉你错误!帮助你抓住你的打字错误@JASONCCREARY确实是这样,尽管获得对您正在做的事情的直接反馈通常更可取。@bkwint,所以在开发中启用显示错误。虽然魔法方法确实有用,但用它们来识别打字错误是我今天听到的最愚蠢的事情。@JasonMcCreary,这是一个很好的副作用,仅此而已。