1

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

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

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

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

谢谢你的帮助。

4

3 回答 3

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
于 2012-11-20T18:00:31.743 回答
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

于 2012-11-20T18:04:10.273 回答
0

实际上,明确定义您的 getter 和 setter 可能是最佳实践。话虽如此,您可以使用__set()__get()魔术方法为从类外部(受保护和私有)无法访问的属性的请求提供通用处理。

因此,您需要做的就是使您的属性受保护/私有并指定__get()方法__set()(也可能需要__isset()以及__unset()如果您将使用isset()或尝试检查unset()属性)。

同样,最好的做法 (IMO) 使所有类属性都无法从类外部访问,并根据需要显式设置 setter/getter 以提供访问权限。

于 2012-11-20T18:06:37.300 回答