PHP массив в коллекцию классов

Я новичок в PHP-рефлексии, поэтому возникла проблема создания объекта из данных дампа.

class Car{
public $id;
public $name;
}

Машина моего класса. Я могу получить свойства класса и значения, как это:

$audi = new Car();

$reflector = new ReflectionClass($audi);

var_dump($reflector->getDefaultProperties());

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

$objects =array("id"=>"1", "name"=>"A3");

function createInstance($objects){
????
}

будет сопоставлен ключ массива со свойством класса.

0

Решение

Как уже упоминал Марк Б, вы можете просто выполнить итерацию массива для динамического задания свойств объектов:

class Car{
public $id;
public $name;
}

function createInstanceOfCar($objects){
$car = new Car();
foreach ($objects as $key => $value)
$car->{$key} = $value;
return $car;
}

$objects =array("id"=>"1", "name"=>"A3");
$car1 = createInstanceOfCar($objects);
var_dump($car1);

Однако, вероятно, было бы лучше иметь эту функциональность внутри самого класса, а не внешней функции:

class CarAlternative{
public $id;
public $name;
function __construct(array $props){
foreach ($props as $key => $value)
$this->{$key} = $value;
}
}

$car2 = new CarAlternative($objects);
var_dump($car2);

И последнее замечание: php позволяет вам устанавливать неопределенные свойства объекта, поэтому, если вы хотите изменить $objects массив для $objects =array("id"=>"1", "name"=>"A3", "wtf"=>"xxx"); тогда вышеупомянутые два объекта также будут содержать wtf имущество.

Чтобы ограничить класс определенными свойствами, вы можете использовать магический метод __set: http://php.net/manual/en/language.oop5.overloading.php#object.set

class CarStricter{
public $id;
public $name;
function __construct(array $props){
foreach ($props as $key => $value)
$this->{$key} = $value;
}
function __set($prop, $val){
//ignore undefined properties
}
}

__set Метод вызывается, когда задано неопределенное свойство. Поскольку мы ничего не делаем в методе, мы переопределяем поведение по умолчанию

Живой пример: http://codepad.viper-7.com/XB86Qn

0

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

Других решений пока нет …

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