2016-07-24 10 views
2

Скажем, у нас есть класс, как это:Как настроить видимость элементов при их динамическом назначении?

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

ответ

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 вызывается, если не существует (или private) свойство доступа извне. Затем они обрабатывают извлечение и настройку значений.

См документ на php.net здесь: http://php.net/manual/en/language.oop5.magic.php