Php 如何将传递到对象构造函数的数组转换为对象';谁的财产?

Php 如何将传递到对象构造函数的数组转换为对象';谁的财产?,php,Php,我应该在课堂上投入什么才能做到这一点 $data = array( 'a' => 12345, 'b' => 67890, ); $object = new Class($data); echo $object->a; //outputs 12345 echo $object->b; //outputs 67890 Ignacio Vazquez Abrams的回答很好,但我更喜欢一个白名单,您希望允许以这种方式设置属性: foreach(array('attr

我应该在课堂上投入什么才能做到这一点

$data = array(
 'a' => 12345,
 'b' => 67890,
);

$object = new Class($data);

echo $object->a; //outputs 12345
echo $object->b; //outputs 67890

Ignacio Vazquez Abrams的回答很好,但我更喜欢一个白名单,您希望允许以这种方式设置属性:

foreach(array('attribute1', 'attribute2') as $attribute_name) {
    if(array_key_exists($attribute_name, $data)) {
        $this->$attribute_name = $data[$attribute_name];
    }
}
这样可以确保未设置任何私有属性

或者,如果您刚刚了解对象语法,则可以执行以下操作:

$object = (object) $data;
$object = $data->a // = 12345

这是将数组强制转换为一个StdClass,Ignacio Vazquez Abrams的回答很好,但我更喜欢一个白名单,其中包含您希望以这种方式设置的属性:

foreach(array('attribute1', 'attribute2') as $attribute_name) {
    if(array_key_exists($attribute_name, $data)) {
        $this->$attribute_name = $data[$attribute_name];
    }
}
这样可以确保未设置任何私有属性

或者,如果您刚刚了解对象语法,则可以执行以下操作:

$object = (object) $data;
$object = $data->a // = 12345

这是将数组强制为一个
StdClass

,这取决于您的用例,也可能是给定解决方案的替代方案:

class A extends ArrayObject {}
这样,数组中的所有属性都可以通过对象表示法和数组表示法访问,例如

$a = new A( array('foo' => 'bar'), 2 ); // the 2 enables object notation
echo $a->foo;
echo $a['foo'];
从类声明中可以看出,实现了许多接口,允许您像使用数组一样使用类:

Class [ <internal:SPL> <iterateable> class ArrayObject 
    implements IteratorAggregate, Traversable, ArrayAccess, Countable ]
Class[类数组对象
实现IteratorAggregate,可遍历,ArrayAccess,可计数]

它还添加了许多方法来完成阵列访问功能。正如在开始时所说,这在您的用例中可能不可取,例如,当您不希望类的行为类似于数组时。

根据您的用例,这也可能是给定解决方案的替代方案:

class A extends ArrayObject {}
这样,数组中的所有属性都可以通过对象表示法和数组表示法访问,例如

$a = new A( array('foo' => 'bar'), 2 ); // the 2 enables object notation
echo $a->foo;
echo $a['foo'];
从类声明中可以看出,实现了许多接口,允许您像使用数组一样使用类:

Class [ <internal:SPL> <iterateable> class ArrayObject 
    implements IteratorAggregate, Traversable, ArrayAccess, Countable ]
Class[类数组对象
实现IteratorAggregate,可遍历,ArrayAccess,可计数]
它还添加了许多方法来完成阵列访问功能。正如在开始时所说,这在您的用例中可能不可取,例如,当您不希望类的行为像数组时