может get_object_vars () вернуть поля из магии __get ()?

Я бегу через набор массивов и объектов для дальнейшей обработки.
Если это объект, который я использую get_object_vars($obj) чтобы получить свои возможности. Но если этот объект использует магические методы получения / установки, он возвращает пустой массив. Вот небольшая демонстрация проблемы:

class Foo {
protected
$fields = array(
'foo'=>1,
'bar'=>2
);
function __get($key) {
return $this->fields[$key];
}
function __isset($key) {
return array_key_exists($key,$this->fields);
}
}

$foo = new Foo();
var_dump(get_object_vars($foo));

Я хочу чтобы get_object_vars возвращает $fields пары ключ-значение. Есть ли способ пойти, или любой метод для реализации в Foo заставить это работать?

спасибо за любую подсказку.

0

Решение

Это связано не с магическими методами, а с тем, что get_object_vars () возвращает массив доступных нестатических свойств для указанного объекта относительно области видимости. Он вернет все свойства, если вызов происходит изнутри объектов, но только публично из-за пределов объекта. Вы можете, однако, использовать IteratorAggregate интерфейс и ArrayIterator класс, и объединить это с iterator_to_array () функция для получения аналогичного поведения и некоторых дополнительных преимуществ, как в этом примере.

class Foo implements IteratorAggregate {
protected
$fields = array(
'foo' => 1,
'bar' => 2
);

function __get( $name ) {
return array_key_exists( $name, $this->fields ) ? $this->fields[$name] : null;
}

public function __set( $name, $value )
{
$this->fields[$name] = $value;
}

function __isset( $name ) {
return isset( $this->fields[$name] );
}

public function getIterator() {
return new ArrayIterator( $this->fields );
}
}

$foo = new Foo();
$foo->baz = 3;

foreach( $foo as $key => $value ) {
echo "$key: $value ";   // OUTPUT: foo: 1 bar: 2 baz: 3
}

array_walk( ( iterator_to_array( $foo ) ), function( $value, $key ) {
echo "$key: $value ";   // OUTPUT: foo: 1 bar: 2 baz: 3
});

print_r( iterator_to_array( $foo ) );   // OUTPUT: Array ( [foo] => 1 [bar] => 2 [baz] => 3 )
2

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

get_object_vars только возвращается видимый свойства. Поскольку вы вызываете функцию извне объекта, она не имеет видимости вашего protected поле, поэтому оно не будет возвращено.

Вместо этого вы можете привести объект к массиву:

var_dump((array) $foo);

Это немного изменит ключ. Посмотри Вот для конкретики.

Другой вариант — создать метод в объекте, который возвращает get_object_vars изнутри, так как все будет видимо. например

class Foo {
...
public function get_object_vars() {
return get_object_vars($this);
}
}
$foo = new Foo();
var_dump($foo->get_object_vars());

И еще один вариант, очевидно, просто изменить свою собственность на public вместо protected,

1

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