我正在寻找有关在php中使用公共变量与私有变量和访问器方法的建议/经验。
例如 $ obj-> foo ='a'; echo $ obj-> foo;
VS $ obj-> setFoo( 'A'); echo $ obj-> getFoo();
我喜欢公共变量的是较短的语法 - 似乎使用的工作量较少。我明白以后可能会使重构变得更加困难,但我从未体验过它(意思是,有时设计会发生变化 - 但通常需要更改访问器方法。)
另一种选择是将变量存储在数组中并使用魔术方法(__get / __ set)来访问它们 - 然后我可以轻松使用具有重构或访问方法的公共变量。
任何人们在php世界中所做的经验或参考。
对于任何持有访问器方法的人来说,最好的方法是,公共变量是否有效需要/使用?
答案 0 :(得分:7)
是的,访问器方法是一种开销,虽然使用setter / getters的语法与直接访问公共属性一样干净......稍微冗长,但同样干净。
访问器方法的最大好处是,您可以使用set方法验证值并拒绝不适当的值(例如,尝试设置应始终为字符串或数组的整数的属性)...但仅此验证如果外部代码无法直接访问该属性,则可以正常工作。
如果您的代码具有相关属性,其中对属性A的更改需要更改属性B,则第二个好处...如果属性是公共的,则无法控制(或强制执行)此属性。
使用set方法可以实现流畅的界面,或者实现更清晰的代码,例如:
echo $obj->setFoo('a');
而不是
$obj->setFoo('a'); echo $obj->getFoo();
如果您在set方法中包含一个返回
答案 1 :(得分:0)
Getters / Setters出现在Java中。它们在脚本语言中没有地位,因此它们在例如它们中是不受欢迎的。 Python和Javascript。它们使API变得更加简洁。
如您所知,您可以使用__get来包装变量访问。这在脚本语言中是可取的。它允许你例如验证中心位置的类型,多个setter / getter中没有重复的代码。
function __set($name, $value) {
if (gettype($value) == $this->_types[$name]) {
$this->_vars[$name] = $value;
}
} // instead of twenty methods checking the type
实现空洞的getter / setter以获得具有企业级代码的代码气味。并且不建议让吸气剂/安装者产生副作用。始终使用真实的方法/消息进行复杂的对象操作。
答案 2 :(得分:0)
setter和getter始终是最佳选择,因为它们为验证/清理提供了更多稳定性。
public function __call($name,$params = array())
{
if(strstr('set',$name))
{
}//returns
if(strstr('get',$name))
{
}//Returns
if(strstr('run',$name))
{
}//Returns
}
答案 3 :(得分:0)
Setters和Getters是封装的一种实现,是OOP原则之一,它表示对象必须是一个黑盒子,只是将行为及其状态暴露给客户端,但是防止其内部暴露。这允许低耦合代码,因为您可以更改Setter和/或Getter中的逻辑,而不会使用您的API影响客户端代码。
正如许多其他人之前所说的,还有其他实现,例如魔术方法。