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

问题描述:

比方说,我们有一类这样的:如何在动态分配成员时设置成员的可见性?

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;

+1

您不能。解释你为什么想要(即你在做什么,而不是你如何试图解决问题)可能会指向一个不同的解决方案。 – AD7six

号没有办法。在这里看到相关的问题: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