Расширение ArrayObject: Почему get_object_vars возвращает пустой массив?

Учитывая следующий класс, почему 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) {
}

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"}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]