PHP中的setter和getter似乎有很多问题。但是,它们似乎都没有提到它们不适用于公共变量。
我有一系列公共变量,在设置时需要相同类型的数据检查(主要是strip_tags()
)。
在保持变量 公开 的同时,最有效的方法是什么?
似乎唯一可用的选项是为我的所有变量创建方法'setPropertyName',这对我来说似乎没用。
感谢您的帮助。
答案 0 :(得分:2)
您可以将其设为私有,并使用公开__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
答案 1 :(得分:0)
您可以尝试的一个方法是魔术方法__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
答案 2 :(得分:0)
实际上,最好的做法是明确定义你的getter和setter。话虽如此,您可以使用__set()
和__get()
魔术方法为对类外无法访问的属性(受保护和私有)的请求提供常见处理。
因此,您需要做的就是让您的属性受到保护/私有,并指定__get()
和__set()
方法(如果方法也需要__isset()
和__unset()
您将使用isset()
或尝试unset()
属性来检查属性。
同样,最好的做法(IMO)是让所有类属性无法从类外部访问,并明确地使setter / getter成为需要提供访问权限。