【问题标题】:How do I set visibility of members when they are dynamically assigned?动态分配成员时如何设置成员的可见性?
【发布时间】:2016-11-27 17:37:15
【问题描述】:

假设我们有一个这样的类:

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

create() 动态分配成员。但是,此成员是公开的:

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

有没有办法让这个成员拥有受保护的或私人的可见性?

(在我的用例中,成员在上面的例子中稍后指定,因此,在顶部声明 protected $some_var; 将无济于事。)

【问题讨论】:

  • 你不能。解释你为什么要这样做(即你在做什么,而不是你试图解决问题的方式)可能会指向不同的解决方案。

标签: php member


【解决方案1】:

没有。没有办法。在此处查看相关问题:Is there any way to set a private/protected static property using reflection classes?

唯一可能的方法是另一种方式 - 将私有成员设为公开。

我不明白你想要达到什么目的,因为这是完全不好的做法,但你可以使用数组:

<?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

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多