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

在php中使用访问器方法与使用公共变量的权衡是什么,php,variables,public,accessor,Php,Variables,Public,Accessor,我正在寻找关于在php中使用公共变量和私有变量以及访问器方法的建议/经验 乙二醇 $obj->foo='a'; echo$obj->foo vs $obj->setFoo('a'); echo$obj->getFoo() 关于公共变量,我喜欢的是较短的语法,只是看起来使用起来比较少。我知道以后重构会变得更加困难,但我从未经历过(这意味着,有时设计会发生变化,但通常访问器方法需要随时改变) 另一种选择是将变量存储在数组中,并使用神奇的方法(_get/_set)来访问它们——这样我就可以轻松地使用公

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

乙二醇 $obj->foo='a'; echo$obj->foo

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

关于公共变量,我喜欢的是较短的语法,只是看起来使用起来比较少。我知道以后重构会变得更加困难,但我从未经历过(这意味着,有时设计会发生变化,但通常访问器方法需要随时改变)

另一种选择是将变量存储在数组中,并使用神奇的方法(_get/_set)来访问它们——这样我就可以轻松地使用公共变量,并能够重构或访问方法

任何关于php世界中人们所做工作的经验或参考资料


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

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

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

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

使用set方法可以实现流畅的界面,或为以下实例编写更清晰的代码:

echo $obj->setFoo('a');
而不是

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

如果在set方法中包含一个return

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

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

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

使用set方法可以实现流畅的界面,或为以下实例编写更清晰的代码:

echo $obj->setFoo('a');
而不是

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

如果在set方法中包含一个return,Java中就会出现getter/setter。它们在脚本语言中没有一席之地,因此在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以获得企业级代码是一种代码味道。而且,让有副作用的能手/二传手也不可取。对于复杂的对象操作,请始终使用实方法/消息。

Java中出现了getter/setter。它们在脚本语言中没有一席之地,因此在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以获得企业级代码是一种代码味道。而且,让有副作用的能手/二传手也不可取。对于复杂的对象操作,始终使用实方法/消息。

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

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

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

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

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

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

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

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

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


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

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


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

我认为$obj->setFoo('a')最好返回$obj,这样我就可以链接它。如果使用$obj->foo(),其中$obj->foo()是getter,$obj->foo('sdf')是setter,那么使用$obj->foo()怎么样?在jquery中使用这种方法似乎可以得到相对干净的结果interface@Yehosef-就个人而言,我总是自己从setter返回对象以构建流畅(链接)的界面,我只是建议其他选项。。。没有什么可以阻止人们使用单个get/set方法(方法名称中是否包含get/set只是一种约定),该方法根据参数是否传递来确定它是getter还是setter。我的论点是使用访问器方法而不是直接访问公共属性的原因。。。这些方法的具体细节是什么