1

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

例如 $obj->foo = 'a'; 回声 $obj->foo;

vs $obj->setFoo('a'); 回声 $obj->getFoo();

我喜欢公共变量的地方在于更短的语法 - 似乎使用起来更少。我知道这可能会使以后的重构变得更加困难,但我从未经历过(意思是,有时设计会发生变化 - 但通常访问器方法需要进行任何更改。)

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

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

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

4

4 回答 4

7

是的,访问器方法是一种开销,尽管使用 setter/getter 的语法与直接访问公共属性一样干净……稍微罗嗦一些,但同样干净。

访问器方法的最大好处是您可以使用您的 set 方法来验证值并拒绝不适当的值(例如,尝试将应始终为整数的属性设置为字符串或数组)......但此验证仅在外部时有效代码无法直接访问该属性。

如果您的代码具有相关属性,则第二个好处是对属性 A 的更改也需要对属性 B 进行更改...如果属性是公共的,则您无法控制(或强制执行)此操作。

使用 set 方法可以让您实现流畅的接口,或者为以下实例更简洁的代码:

echo $obj->setFoo('a');

代替

$obj->setFoo('a'); echo $obj->getFoo();

如果您在 set 方法中包含 return

于 2010-09-13T09:03:48.383 回答
0

Getter/Setter 出现在 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 以获得具有企业外观的代码是一种代码味道。并且使用带有副作用的 getter/setter 也是不可取的。始终使用真实的方法/消息进行复杂的对象操作。

于 2010-09-13T09:08:38.223 回答
0

setter 和 getter 始终是最佳选择,因为它们为验证/清理提供了更高的稳定性。

public function __call($name,$params = array())
{
    if(strstr('set',$name))
    {
    }//returns

    if(strstr('get',$name))
    {
    }//Returns

    if(strstr('run',$name))
    {
    }//Returns
}
于 2010-09-13T09:11:42.990 回答
0

Setter 和 Getter 是一种封装的实现,是 OOP 原则之一,它说对象必须是一个黑盒子,只是将行为及其状态暴露给它的客户,但防止其内部暴露。这允许低耦合代码,因为您可以更改 Setter 和/或 Getter 内部的逻辑,而不会影响使用您的 API 的客户端代码。

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

于 2014-03-17T13:22:58.033 回答