似乎有很多关于 PHP 中的 setter 和 getter 的问题。但是,它们似乎都没有提到它们不适用于公共变量。
我有一系列公共变量,在设置时需要相同类型的数据检查(主要是strip_tags()
)。
在保持变量公开的同时,最有效的代码方法是什么?
似乎可用的唯一选项是为我的所有变量创建一个方法“setPropertyName”,这对我来说似乎没有必要。
谢谢你的帮助。
似乎有很多关于 PHP 中的 setter 和 getter 的问题。但是,它们似乎都没有提到它们不适用于公共变量。
我有一系列公共变量,在设置时需要相同类型的数据检查(主要是strip_tags()
)。
在保持变量公开的同时,最有效的代码方法是什么?
似乎可用的唯一选项是为我的所有变量创建一个方法“setPropertyName”,这对我来说似乎没有必要。
谢谢你的帮助。
您可以将它们设为私有,并使用公共__set()
并__get()
获取变量(如果存在),并在设置时应用验证/清理操作。
例如:
class Foo {
private $variable;
private $otherVariable;
public function __get($key) {
return $this->$key;
}
public function __set($key, $value) {
$this->$key = strip_tags($value);
}
}
$foo = new Foo;
$foo->variable = "test"; //Works.
echo $foo->variable; //test
您可以尝试的一件事是魔术方法__call($name,$args)
,然后您就不需要编写 setPropertyName 和 getPropertyName 函数:
function __call($name,$args){
$variable=lcfirst(substr($name,3));
if(!isset($this->$variable))
return false;
if(substr($name,0,3)=='set')
$this->$variable=$args[0];
else
return $this->$variable;
return true;
}
话虽如此,如果使用得当,魔术方法__get
和公共变量的工作效果很好。__set
以下是我如何使用它们:
public $variables=array();
function __get($name){
return isset($this->variables[$name])?$this->variables[$name]:false;
}
function __set($name,$value){
$this->variables[$name]=$value;
}
然后您可以通过使用$this->name;
而不是$this->getName();
将它们放在一起来访问它们,然后您可以随心所欲地进行操作。
再次,这是一个骨干。如果要去除标签,可以将其放入代码中的 setter 或 getter 函数中,或者修改调用函数以检查将去除标签的第二个参数$this->setName($value,true);//strip tags
实际上,明确定义您的 getter 和 setter 可能是最佳实践。话虽如此,您可以使用__set()
和__get()
魔术方法为从类外部(受保护和私有)无法访问的属性的请求提供通用处理。
因此,您需要做的就是使您的属性受保护/私有并指定__get()
方法__set()
(也可能需要__isset()
以及__unset()
如果您将使用isset()
或尝试检查unset()
属性)。
同样,最好的做法 (IMO) 使所有类属性都无法从类外部访问,并根据需要显式设置 setter/getter 以提供访问权限。