oop — динамическое объявление переменной внутри класса в переполнении стека

У меня проблемы с динамическим объявлением переменных внутри класса / объекта в PHP.

У меня есть класс с именем Column, и он получает ассоциативный массив (names => values) неизвестной длины.

Мне нужно, чтобы переменные класса имели точно такое же имя, как и в массиве (и их значения должны совпадать явно).

Поскольку метод Variable Variables немного сбивает с толку, когда вы добавляете поверх него синтаксис объявления класса / объекта, я чувствую, что в нем немного потерял себя.

Я попробовал что-то вроде этого:

function __construct($array)
{
foreach ($array as $key => $value)
{
$this->$key;
$this->key=$value;
}
}

я бы обычно этого не делал

$this->$key;

я думал $this->key подошел бы синтаксис, но, видимо, я ошибся. Если бы кто-то мог помочь мне исправить это было бы очень полезно.

5

Решение

Просто используйте синтаксис {}:

function __construct($array)
{
foreach ($array as $key => $value)
{
$this->{$key} = $value;
}
}
5

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

Вместо

$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->{'!"§$%'};
0

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