Я новичок в 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){
????
}
будет сопоставлен ключ массива со свойством класса.
Как уже упоминал Марк Б, вы можете просто выполнить итерацию массива для динамического задания свойств объектов:
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
Других решений пока нет …