Я бегу через набор массивов и объектов для дальнейшей обработки.
Если это объект, который я использую 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
заставить это работать?
спасибо за любую подсказку.
Это связано не с магическими методами, а с тем, что 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 )
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
,