在php中使用访问器方法与公共变量的权衡是什么

时间:2010-09-13 08:55:20

标签: php variables public accessor

我正在寻找有关在php中使用公共变量与私有变量和访问器方法的建议/经验。

例如 $ obj-> foo ='a'; echo $ obj-> foo;

VS $ obj-> setFoo( 'A'); echo $ obj-> getFoo();

我喜欢公共变量的是较短的语法 - 似乎使用的工作量较少。我明白以后可能会使重构变得更加困难,但我从未体验过它(意思是,有时设计会发生变化 - 但通常需要更改访问器方法。)

另一种选择是将变量存储在数组中并使用魔术方法(__get / __ set)来访问它们 - 然后我可以轻松使用具有重构或访问方法的公共变量。

任何人们在php世界中所做的经验或参考。

对于任何持有访问器方法的人来说,最好的方法是,公共变量是否有效需要/使用?

4 个答案:

答案 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是封装的一种实现,是OO​​P原则之一,它表示对象必须是一个黑盒子,只是将行为及其状态暴露给客户端,但是防止其内部暴露。这允许低耦合代码,因为您可以更改Setter和/或Getter中的逻辑,而不会使用您的API影响客户端代码。

正如许多其他人之前所说的,还有其他实现,例如魔术方法。