Есть ли способ сериализации объекта в массив при вызове этого кода:
class Obj {
private $prop;
public function __construct($v) {
$this->prop = $v;
}
}
$object = new Obj('value');
$result = (array) $object;
print_r($result);
// should display something like Array ( prop => value )
// via a magic function call in the object ?
Некоторые объекты ArrayObject, Traversable и другие могут помочь использовать объекты внутри foreach, count() и т.п. Но с синтаксисом силового массива, что мы можем сделать?
благодаря
EDIT Я нашел этот пост, который был лучше объяснен, чем мой :). Кастинг объекта массиву - какой-нибудь магический метод называется?
Ответ: нет, вы не можете запросить магический метод при вызове (массив) $ object
get_object_vars
игнорирует объявления видимости при вызове из правильной области:
class Obj {
private $prop;
public function __construct($v) {
$this->prop = $v;
}
public function asArray() {
return get_object_vars($this);
}
}
$object = new Obj('value');
$result = $object->asArray();
print_r($result); // Array([prop] => value)
Ваш код верен, но свойство prop
является закрытым, поэтому, когда вы пытаетесь распечатать, вы вернетесь примерно так:
Array
(
[Objprop] => value
)
Чтобы вернуть prop
качестве ключа, вы должны сделать свою собственность открытой или вы можете использовать функцию getter:
public function getV(){
return $this->v;
}
function __clone()
дляclone $object
. Например,function __toArray()
для(array) $object
__toString
для массивов? Нет, такого нет, AFAIK.