Допустим, у нас есть такой класс:
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
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
Других решений пока нет …