У меня есть этот класс,
class example {
public $a;
public $b;
public $c;
....
}
У меня есть массив, содержащий равное количество открытых переменных, представленных в примере класса (в данном случае 3):
$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';
Я хочу присвоить каждое значение этого массива общедоступным свойствам класса по одному (как $a
получает Red
, $b
получает Green
и так далее). Как назначить эти значения из массива для открытых свойств класса используя цикл?
Я писал что-то вроде ниже, но это не сработало:
$class = new example();
$i = 0;
foreach ($class as $key => $value) {
$class->$$key = $arr[$i];
$i++;
}
РЕДАКТИРОВАТЬ:
Просто чтобы объяснить, почему я не мог использовать какой-либо метод установки / получения в example
класс — на самом деле example
Класс создается путем десериализации объекта базы данных. У меня нет никакого контроля над этим классом. Я работаю над классом контроллера, который получает это example
класс и массив. Мне нужно выяснить способ присвоения значений из этого массива общедоступным свойствам example
учебный класс.
Это не работает из-за двойного $$
когда вы назначаете ключ:
$class->$$key = $arr[$i];
Изменить на один $
$class->$key = $arr[$i];
При доступе к свойствам объекта без переменной, нет $
необходимо, поэтому, если ваш ключ хранится в переменной, один $
нужно.
Тем не менее, есть, вероятно, лучший способ решить проблему, чем этот. Похоже на X Y Проблема.
Ну вот:
<?php
class example {
public $a;
public $b;
public $c;
}
$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';
$class = new example();
$i = 0;
foreach ($class as $key => $value) {
$class->{$key} = $arr[$i];
$i++;
}
var_dump($class);
Основная идея заключается в использовании $class->{$key}
вместо $class->$$key
, так как $$key
это переменная переменная.
Ну, как я уже говорил, подход неправильный. Есть два ответа, которые говорят вам, как это сделать, но это не лучший способ.
Это немного лучший способ, и он умнее — потому что у вас меньше кода, меньше работы и вы можете добавить столько свойств, сколько захотите, даже не касаясь класса.
Код:
class MyClass {
protected $_data = array();
public function setData(array $data)
{
$this->_data = $data;
}
public function __set($key, $value)
{
$this->_data[$key] = $value;
}
public function __get($key)
{
return isset($this->_data[$key]) ? $this->data[$key] : null;
}
}
Сценарий использования № 1:
$class = new MyClass;
$class->red = 'My red value';
$class->blue = 'My blue value';
Сценарий использования № 2:
$class = new MyClass;
$class->setData( array('red' => 'Red', 'blue' => 'Blue', 'green' => 'Green') );
Этот пример направляет вас к магическим функциям __get () и __set (), которые вы можете использовать в своих интересах и кодировать класс (с правильной проверкой данных и значений) таким образом, чтобы его можно было использовать без объявления его свойств. Это уменьшает сложность. Или вы можете использовать один из приведенных ответов, если он удовлетворительно соответствует вашему сценарию.