Как настроить видимость членов, когда они назначаются динамически?

Допустим, у нас есть такой класс:

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; наверху не поможет.)

2

Решение

Нет, нет пути. Смотрите связанный вопрос здесь: Есть ли способ установить закрытое / защищенное статическое свойство, используя классы отражения?

Единственно возможная вещь — это другой способ — сделать частного члена публичным.

Я не понимаю, чего вы пытаетесь достичь, так как это абсолютно плохая практика, но вы можете использовать массивы:

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]