У меня проблемы с динамическим объявлением переменных внутри класса / объекта в PHP.
У меня есть класс с именем Column, и он получает ассоциативный массив (names => values) неизвестной длины.
Мне нужно, чтобы переменные класса имели точно такое же имя, как и в массиве (и их значения должны совпадать явно).
Поскольку метод Variable Variables немного сбивает с толку, когда вы добавляете поверх него синтаксис объявления класса / объекта, я чувствую, что в нем немного потерял себя.
Я попробовал что-то вроде этого:
function __construct($array)
{
foreach ($array as $key => $value)
{
$this->$key;
$this->key=$value;
}
}
я бы обычно этого не делал
$this->$key;
я думал $this->key
подошел бы синтаксис, но, видимо, я ошибся. Если бы кто-то мог помочь мне исправить это было бы очень полезно.
Просто используйте синтаксис {}:
function __construct($array)
{
foreach ($array as $key => $value)
{
$this->{$key} = $value;
}
}
Вместо
$this->$key;
$this->key=$value;
Так должно быть
$this->$key=$value;
Свойство переменной $this->$key;
как единственный оператор обращается к свойству с именем в $key
но ничего с этим не делает. Но это вызовет уведомление Неопределенное свойство если свойство не было объявлено или динамически назначено ранее.
$this->key
доступ к буквальному key
свойство, то есть public $key;
если это было объявлено явно.
$this->$key
получает доступ к свойству с именем, хранящимся в $key
, Так что если $key === 'foo'
это так же, как $this->foo
,
Динамическое назначение свойств, которые не были объявлены ранее, не зависит от использования переменных свойств. Так что если собственность $foo
не существует, $this->foo = 1
такой же как $this->$key = 1
с $key === 'foo'
, Оба создают государственную собственность $foo
на текущем объекте.
Если $key
не строка, она будет приведена к строке. Если это объект или ресурс, который нельзя преобразовать в строку, вы получите не может быть преобразован в строку ошибка.
Если $key
преобразует в пустую строку, вы получите Невозможно получить доступ к пустому свойству ошибка.
Если $key
начинается с цифры или содержит специальные символы, которые обычно не допускаются в именах переменных (например, $
), свойство будет создано в любом случае. Доступ к свойствам с такими именами всегда возможен, если вы используете {}
использовать произвольные выражения в качестве имен свойств. Попробуй это:
$o = new stdclass;
$o->{'!"§$%'} = 'it works';
echo $o->{'!"§$%'};