PHP: сериализировать как массив объект через (массив) $ объект

0

Есть ли способ сериализации объекта в массив при вызове этого кода:

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

Теги:
object
arrays

2 ответа

0
Лучший ответ

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)
  • 0
    хорошо, так что нет ничего лучше function __clone() для clone $object . Например, function __toArray() для (array) $object
  • 0
    Вы имеете в виду, как __toString для массивов? Нет, такого нет, AFAIK.
Показать ещё 1 комментарий
0

Ваш код верен, но свойство prop является закрытым, поэтому, когда вы пытаетесь распечатать, вы вернетесь примерно так:

Array
(
    [Objprop] => value
)

Чтобы вернуть prop качестве ключа, вы должны сделать свою собственность открытой или вы можете использовать функцию getter:

public function getV(){
     return $this->v;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню