2015-02-04 3 views
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 Я нашел этот пост, который был вопросом лучше объяснить Тан мину :) Casting object to array - any magic method being called?

Ответ: нет, вы не можете попросить волшебный метод при вызове (массив) объекта $

ответ

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()' for '(array) $ object' – rekam

+0

Вы имеете в виду, как' __toString' для массивов? Нет, нет такой вещи, AFAIK. – georg

+0

хорошо, спасибо за этот быстрый ответ! – rekam

0

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

Array 
(
    [Objprop] => value 
) 

Для того, чтобы вернуть prop как ключ, вы должны сделать вашу собственность общественности или вы можете сделать функцию геттер:

public function getV(){ 
    return $this->v; 
} 
Смежные вопросы