Учитывая следующий класс, почему get_object_vars
вернуть пустой массив? Это происходит только тогда, когда я расширяю PHP ArrayObject
но в документации мне не удается выяснить причину такого поведения.
class Test extends ArrayObject
{
public $foo;
public $bar;
public function setFooBarValues( array $values )
{
$this->foo = !empty( $values['foo'] ) ? $values['foo'] : null;
$this->bar = !empty( $values['bar'] ) ? $values['bar'] : null;
}
public function getArrayCopy()
{
return get_object_vars( $this );
}
}
Выполнение следующего кода, который сначала устанавливает значения объекта, показывает, что get_object_vars
не возвращает свойства объекта.
$object = new Test( array( 'lemon' => 1, 'orange' => 2, 'banana' => 3, 'apple' => 4 ) );
$object->setFooBarValues( array( 'foo' => 'x', 'bar' => 'y' ) );
var_dump( $object->getArrayCopy() );
Ожидаемый результат:
array(2) {
["foo"]=>
string(1) "x"["bar"]=>
string(1) "y"}
Фактический результат:
array(0) {
}
Хотя причина не объяснена в руководство объект, кажется, обрабатывает все свои свойства внутри. Посмотрите на второй параметр конструктора int $flags = 0
и два флага предусмотрено в руководстве:
ArrayObject :: STD_PROP_LIST
Свойства объекта имеют свою обычную функциональность при доступе в виде списка (var_dump, foreach и т. Д.).
ArrayObject :: ARRAY_AS_PROPS
Записи могут быть доступны как свойства (чтение и запись).
Постоянная STD_PROP_LIST
это то, что вы хотите использовать для стандартного доступа к собственности. Предоставление конструктору этой константы даст вам результат, который вы ищете:
$object = new Test(
array( 'lemon' => 1, 'orange' => 2, 'banana' => 3, 'apple' => 4 ),
ArrayObject::STD_PROP_LIST
);
$object->setValues( array( 'foo' => 'x', 'bar' => 'y' ) );
var_dump( $object->getArrayCopy() );
Результат:
array(2) {
["foo"]=>
string(1) "x"["bar"]=>
string(1) "y"}
Других решений пока нет …