如何在动态分配成员时设置成员的可见性



比方说,我们有一个这样的类:

class X {
    public static function create ($a, $b) {
        $x = new X();
        $x->$a = $b;
        return $x;
    }
}

CCD_ 1动态分配成员。但是,该成员是公开的:

>>> X::create("name", "Robert")
=> X {#93
     +"name": "Robert",
   }
>>> $x->name
=> "Robert"

是否有办法使该成员具有受保护或私人可见性?

(在我的用例中,稍后会像上面的情况一样指定成员,所以在顶部声明protected $some_var;没有帮助。)

否。没有办法。请参阅此处的相关问题:是否有任何方法可以使用反射类设置私有/受保护的静态属性?

唯一可能的事情是另一种方式——公开一个私人成员。

我不明白你想要实现什么,因为这是一种完全糟糕的做法,但你可以使用数组:

<?php
class Foo
{
    private $data;
    function __get($name)
    {
        if (isset($this->data[$name])) {
            return $this->data[$name];
        }
        return null;
    }
    function __set($name, $value)
    {
        $this->data[$name] = $value;
    }
}
$foo = new Foo();
$foo->var = 123;
var_dump($foo->var);
var_dump($foo);

输出如下:

int(123)
object(Foo)#1 (1) {
["data":"Foo":private]=>
  array(1) {
        ["var"]=>
    int(123)
  }
}

因此,您可以动态地将属性添加到类中。然后将"属性"值存储在数组中,数组本身是私有的。如果从外部访问不存在(或私有)的属性,则调用神奇的函数__get和__set。然后,它们处理值的检索和设置。

请参阅php.net上的文档:http://php.net/manual/en/language.oop5.magic.php

最新更新