如何在动态分配成员时设置成员的可见性?
问题描述:
比方说,我们有一类这样的:如何在动态分配成员时设置成员的可见性?
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;
)
答
号没有办法。在这里看到相关的问题: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
您不能。解释你为什么想要(即你在做什么,而不是你如何试图解决问题)可能会指向一个不同的解决方案。 – AD7six