声明中的财产访问者

时间:2015-03-02 22:45:36

标签: php oop

我正在寻找一种维护$this->property = "value"语法的方法,但是使用getter和setter方法。

我发现了几个对魔术函数__get()__set()的引用,但我希望在更多情况下提供访问器。

然后我发现了这个:https://wiki.php.net/rfc/propertygetsetsyntax-v1.2,这看起来就像我在寻找的那样,但唉似乎没有实现。

有没有办法在没有类范围的函数的情况下检查每个属性赋值?

2 个答案:

答案 0 :(得分:0)

对我来说,你有两个选择:

  1. 您希望使用魔术方法覆盖所有getter和setter,并且您将存储您的数据,这些数据将在$ this-&gt; _data []等属性中获取/设置,以避免与其他属性冲突< / LI>
  2. 您想要创建特定的getter / setter,并在您希望它们使用的类中手动定义它们(或者在继承链的高处,以便它们可以扩展到它的每个类 - 在MVC中很有用建筑)。
  3. 魔术方法方法很好,涵盖所有基础&#34;方法,而个别方法更清晰,更准确地了解实施/儿童可用的内容。

    选项1(魔术方法)的一个很好的例子是available in the manual, here

    我想补充一点,如果你想要一个&#34; case by case&#34;在属性的基础上,您还可以在魔术方法中添加白名单/黑名单,以包含/排除一组特定的属性,例如扩展手册中的内容:

    private $data = array();
    private $whitelist = array('PropertyIWant', 'AnotherOneIWant');
    
    // ...
    
        public function __get($name)
        {
            // ...
            if (array_key_exists($name, $this->data) && in_array($name, $this->whitelist)) {
                return $this->data[$name];
            }
            // ...
    

答案 1 :(得分:0)

你可以使用电话:

class Test {
    protected $a;

    protected $b;

    protected $valueForC;

    protected $otherData = array('d' => null);

    public function __call($method, $args) {
        if (preg_match('#^((?:get|set))(.*)$#', $method, $match)) {
           $property = lcfirst($match[2]);
           $action = $match[1];
           if ($action === 'set') {
              $this->$property = $args[0];
           } else {
             return $this->$property;
           }
        }
    }

    public function getD() {
       return $this->otherData['d'];
    }

    public function setD($value)
    {
       $this->otherData['d'] = $value;
    }
}

$x = new Test();
$x->setA('a value');
$x->setB('b value');
$x->setValueForC('c value');
$x->setD('special value for D');

echo $x->getA() ."\n";
echo $x->getB() ."\n";
echo $x->getValueForC() ."\n";
echo $x->getD() ."\n";