我是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){
????
}
将数组键与类属性匹配。
正如Marc B所提到的,您可以简单地迭代数组来动态设置对象属性:
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