PHP - 在类的所有公共属性上使用一个setter

时间:2012-11-20 17:57:39

标签: php oop properties getter-setter

PHP中的setter和getter似乎有很多问题。但是,它们似乎都没有提到它们不适用于公共变量。

我有一系列公共变量,在设置时需要相同类型的数据检查(主要是strip_tags())。

在保持变量 公开 的同时,最有效的方法是什么?

似乎唯一可用的选项是为我的所有变量创建方法'setPropertyName',这对我来说似乎没用。

感谢您的帮助。

3 个答案:

答案 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成为需要提供访问权限。