PHP数组到类集合


PHP array to class collection

我是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