Выполнение цикла через свойства объекта и присвоение значения

У меня есть этот класс,

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 учебный класс.

1

Решение

Это не работает из-за двойного $$ когда вы назначаете ключ:

$class->$$key = $arr[$i];

Изменить на один $

$class->$key = $arr[$i];

Кодовая демонстрация

При доступе к свойствам объекта без переменной, нет $ необходимо, поэтому, если ваш ключ хранится в переменной, один $ нужно.

Тем не менее, есть, вероятно, лучший способ решить проблему, чем этот. Похоже на X Y Проблема.

1

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

Ну вот:

<?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 это переменная переменная.

1

Ну, как я уже говорил, подход неправильный. Есть два ответа, которые говорят вам, как это сделать, но это не лучший способ.

Это немного лучший способ, и он умнее — потому что у вас меньше кода, меньше работы и вы можете добавить столько свойств, сколько захотите, даже не касаясь класса.

Код:

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 (), которые вы можете использовать в своих интересах и кодировать класс (с правильной проверкой данных и значений) таким образом, чтобы его можно было использовать без объявления его свойств. Это уменьшает сложность. Или вы можете использовать один из приведенных ответов, если он удовлетворительно соответствует вашему сценарию.

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