有哪些策略可用于为PHP类的私有成员创建访问器和更改器?这个建议是否合适:http://cormacscode.wordpress.com/2009/01/22/read-only-object-variables-in-php-using-magic-methods/
<?php
class classWithReadOnlyVar
{
private $readOnlyVar;
public function __get($varName)
{
return $this->$varName;
}
public function __set($varName,$varValue)
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果某些成员需要私有,公共或受保护的财产方法怎么办?
首先__get,__set等被定义public,你不能让他们并非如此.应该明智地使用魔术方法,因为调用魔法方法所需的时间大约是调用类方法的三倍.
class A {
public function __get($name) { ... }
public function __getValue() { ... } // <== is faster
}
Run Code Online (Sandbox Code Playgroud)
通常(通常,最好),您将拥有您的类成员private或protected(从不public)并具有访问器和更改器来封装它们.这些访问者和增变器可以具有任何可见性,这取决于用户可以对成员做什么.您也可以通过仅为成员声明访问器来创建不可变类,这些访问器仅在构造函数中初始化.
因此,您的示例类应该阅读
class classWithReadOnlyVar {
private $readOnlyVar;
public function getReadonlyVar() {
return $this->readOnlyVar;
}
}
Run Code Online (Sandbox Code Playgroud)
而且不应该使用魔法.
可能有很多理由要避免使用魔术方法:
protected神奇的方法班级成员
他们的知名度应该是,private或者protected,这取决于你是否希望通过继承来访问它们.他们永远不应该public因为这打破了OO范式.
受保护成员的示例:
class A {
protected $_name = 'A';
public function getName() { return $this->_name; }
}
class B {
protected $_name = 'B'; // getName() will not return 'B'
}
Run Code Online (Sandbox Code Playgroud)
(不$_name是protected,这将是不可能的,也没有必要重新确定存取器)
访问器
他们应该是protected或public.拥有一个private访问者毫无意义; 一个类应该直接访问它的成员.如果该成员需要处理,则该类将知道何时调用访问者.
存取器
他们应该是protected或public.对于访问者来说,拥有一个privatemutator 是没有意义的...除非在处理需要在内部完成时非常罕见.如果一个类成员没有访问,它应该不会有突变.如果没有能够以某种方式获得值,则设置值也没有意义.