Php model to array

Casting object to array — any magic method being called?

Is there any magic (or not magic :)) method that is being called at this moment? Or is there any other way to intercept it? I know I can write a simple method, eg. asArray() in Foo, but I’m looking for some more «native» PHP ways.

6 Answers 6

No

There is no __toArray magic method in PHP. An enhancement proposal has been rejected in 2006 with the following answer:

[2006-08-20 11:12 UTC] helly@php.net

Why not simply have a method asArray() maybe even as par of an interface:

interface ArrayConversion

See, we have __toString as it is supported in language constructs like echo, print and other internal functions. But we decided against an autoconversion for arrays already. So itwill never be supported in any language construct. That said there is no needed for this and nothing you would win against the above interface. In fact you would make it php more complex because you’d add just one more magic feature.

It is thus very unlikely that it will be implemented in any future release (which is a pity, if you ask me).

Читайте также:  Python как посчитать строки

It’s strange he should say so, cause actually php has an object to array convertion: php.net/manual/en/…

You can have the class implement the ArrayAccess interface. This will allow you to treat the object like an array without casting and you get total control over how the members are used.

Though nice, this answer doesn’t really address the question. You should at least include the word «no» in there somewhere 🙂

Good point, but state somewhere at the beginning of the answer that implementing the ArrayAccess interface is not sufficient to cast an object to an array.

Should also be noted that in order to loop over elements contained within the object that extends ArrayAccess using foreach , you must also implement \IteratorAggregate or \Iterator . Generally those looking to reproduce array functionality within an object use implements \Countable, \IteratorAggregate, \ArrayAccess See \ArrayObject.

Sadly no, casting to array doesn’t trigger any magic method like it is done with:

which triggers __toString() method and which you can override.

However, you may write a custom toArray() method.

You may also be interested in the Serializable interface which allows you to write custom serializer strategy.

Not sure if this question still relevant, but php has builtin ArrayObject class, that allows to treat object as array and can be handy when used as container for database record or collection.

It might be not a best practice in regards to strict types, but it allows to treat object as array and both statements are valid.

$obj = new ArrayObject(['a' => 'alpha']); var_dump($obj['a']); //alpha var_dump($obj->getOffset('a'));//alpha 

However you need to keep in mind behaviour of ArrayObject

$obj = new ArrayObject(['a' => 'alpha']); //Access Property var_dump($obj['a']); //alpha var_dump($obj->offsetGet('a'));//alpha var_dump($obj->a); //null Notice: Undefined property: ArrayObject::$a //Serialization var_dump(serialize($obj));// string 'C:11:"ArrayObject":41:;m:a:0:<>>' (length=65) var_dump($obj->serialize());// string 'x:i:0;a:1:;m:a:0:<>' var_dump(serialize($obj) === $obj->serialize());// false . //Setting Properties $obj['b'] = 'beta'; //OK $obj->c = 'gamma'; //value becomes object property. var_dump($obj); /* OBJECT DUMP object(ArrayObject)[13] public 'c' => string 'gamma' (length=5) private 'storage' => array (size=2) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) */ //Property validation as array var_dump(isset($obj['a']));//true var_dump(isset($obj['b']));//true var_dump(isset($obj['c']));//false //Property validation as object var_dump(isset($obj->a));//false var_dump(isset($obj->b));//false var_dump(isset($obj->c));//true //Typecasting var_dump((array)$obj); /* array (size=2) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) */ //var_dump((string)$obj);// Catchable fatal error: Object of class ArrayObject could not be converted to string 

ArrayObject accepts two flags ArrayObject::STD_PROP_LIST as default and ArrayObject::ARRAY_AS_PROPS as alternative.

This would change behaviour for reading values but does not support setting new properties in that way, here is example:

$obj = new ArrayObject(['a' => 'alpha'], ArrayObject::ARRAY_AS_PROPS); //Access Property var_dump($obj['a']); //alpha var_dump($obj->offsetGet('a'));//alpha var_dump($obj->a);//alpha //Serialization var_dump(serialize($obj));// string 'C:11:"ArrayObject":41:;m:a:0:<>>' (length=65) var_dump($obj->serialize());// string 'x:i:0;a:1:;m:a:0:<>' var_dump(serialize($obj) === $obj->serialize());// false . //Setting Properties $obj['b'] = 'beta'; //OK $obj->c = 'gamma'; //OK var_dump($obj); /* OBJECT DUMP object(ArrayObject)[14] private 'storage' => array (size=3) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) 'c' => string 'gamma' (length=5) */ //Property validation as array var_dump(isset($obj['a']));//true var_dump(isset($obj['b']));//true var_dump(isset($obj['c']));//false . //Property validation as object var_dump(isset($obj->a));//true var_dump(isset($obj->b));//true var_dump(isset($obj->c));//true //Typecasting var_dump((array)$obj); /* array (size=2) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) */ 

To make this behaviour more consistent you would have to extend this class and implement magic methods __get() , __set() , __isset() and __unset() .

Another tricky part is serialization, default method serialize would return you a copy serialized $storage variable instead of object itself, as workaround to return serialized copy of instance you can implement default serialization in __toString method, this way it’s behave correctly.

class FooObject extends ArrayObject < public function __get($index) < if ($this->offsetExists($index)) < return $this->offsetGet($index); > else < throw new UnexpectedValueException('Undefined key ' . $index); >> public function __set($index, $value) < $this->offsetSet($index, $value); return $this; > public function __isset($index) < return $this->offsetExists($index); > public function __unset($index) < return $this->offsetUnset($index); > public function __toString() < return serialize($this); >> 
$obj2 = new FooObject(['a' => 'alpha']); //Access Property var_dump($obj2['a']); //alpha var_dump($obj2->offsetGet('a'));//alpha var_dump($obj2->a); //alpha //Serialization var_dump(serialize($obj));// string 'C:11:"ArrayObject":41:;m:a:0:<>>' (length=65) var_dump($obj->serialize());// string 'x:i:0;a:1:;m:a:0:<>' var_dump(serialize($obj) === $obj->serialize());// false . //Setting Properties $obj2['b'] = 'beta'; //OK $obj2->c = 'gamma'; //OK var_dump($obj2); /* OBJECT DUMP object(FooObject)[14] private 'storage' (ArrayObject) => array (size=3) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) 'c' => string 'gamma' (length=5) */ //Property validation as array var_dump(isset($obj2['a']));//true var_dump(isset($obj2['b']));//true var_dump(isset($obj2['c']));//true //Property validation as object var_dump(isset($obj2->a));//true var_dump(isset($obj2->b));//true var_dump(isset($obj2->c));//true //Typecasting var_dump((array)$obj2); /* array (size=3) 'a' => string 'alpha' (length=5) 'b' => string 'beta' (length=4) 'c' => string 'gamma' (length=5) */ 

Источник

Преобразование объекта PHP в ассоциативный массив

Преобразование объекта PHP в ассоциативный массив

  1. Используйте ключевое слово array для преобразования типа объекта StdClass в ассоциативный массив в PHP
  2. Используйте объект StdClass внутри пользовательского класса для преобразования объекта в ассоциативный массив в PHP
  3. Используйте функции json_encode() и json_decode() для преобразования объекта в ассоциативный массив в PHP

Мы представим метод преобразования объекта PHP в ассоциативный массив, задавая типы объектов StdClass с помощью ключевого слова array . Для отображения ассоциативного массива воспользуемся функцией var_dump() .

Второй подход демонстрирует другой метод преобразования объекта PHP в ассоциативный массив, создающий StdClass в конструкторе определяемого пользователем класса. Преобразуем объект в ассоциативный массив, как в первом методе, с помощью ключевого слова array . Этот метод следует объектно-ориентированному подходу.

Мы также представим еще один метод преобразования объекта в ассоциативный массив в PHP с использованием функций json_encode() и json_decode() . Мы будем использовать StdClass для создания объекта и динамических свойств.

Используйте ключевое слово array для преобразования типа объекта StdClass в ассоциативный массив в PHP

Мы можем создать пустой класс StdClass для создания объекта в PHP и использовать объект для создания свойств. Объект класса может напрямую обращаться к свойствам. Он также может создавать динамические свойства для класса. Мы можем использовать объект массив для преобразования типа объекта в массив. Функция var_dump() выводит информацию о типе и значениях массива.

Например, создайте объект $object класса StdClass с помощью оператора new . Создайте два свойства, используя $object с именами car1 и car2 . Присвойте свойствам значения porsche и bugatti . Используйте ключевое слово array для приведения типа переменной $object . Оберните ключевое слово array круглыми скобками перед переменной $object и выгрузите значение с помощью функции var_dump() . В приведенном ниже примере объекты преобразуются в ассоциативный массив, как показано в разделе вывода. Он показывает пары ключ и значение для каждого элемента массива.

#php 7.x  php $object = new StdClass; $object->car1 = "porsche"; $object->car2 = "bugatti"; var_dump( (array) $object ); ?> 
array(2) < ["car1"]=>string(7) "porsche" ["car2"]=> string(7) "bugatti" > 

Используйте объект StdClass внутри пользовательского класса для преобразования объекта в ассоциативный массив в PHP

Мы можем создать экземпляр StdClass в конструкторе класса и использовать ключевое слово array для преобразования объекта класса в ассоциативный массив. Мы можем создать класс и определить некоторые его свойства. Конструктор класса инициализирует свойства класса конкретными значениями. Мы можем создать объект StdClass и присвоить ему одно из свойств класса. Оператор new вместе с классом вызывает конструктор. Мы можем использовать ключевое слово array прямо перед вызовом, чтобы преобразовать объект класса в ассоциативный массив.

Например, создать класс Мотоцикл . Создайте три свойства класса с модификатором доступа private как $name , $color и $type . Создайте конструктор класса и внутри конструктора инициализируйте значения свойств. Напишите Husky для name , white для color и создайте объект StdClass для type . Используйте ключевое слово $this для инициализации свойств. Вне класса вызовите класс Motorcycle и используйте ключевое слово array для приведения типов перед вызовом. Используйте функцию var_dump() , чтобы вывести информацию о типизированном массиве.

#php 7.x  class Motorcycle  private $name;  private $color;  private $type;  public function __construct()  $this->name = "Husky";  $this->color = "white";  $this->type = new StdClass;  > > var_dump( (array) new Motorcycle ); 
array(3) < ["Motorcyclename"]=>string(5) "Husky" ["Motorcyclecolor"]=> string(5) "white" ["Motorcycletype"]=> object(stdClass)#2 (0) < >> 

Используйте функции json_encode() и json_decode() для преобразования объекта в ассоциативный массив в PHP

Функция json_encode() кодирует значение в объект JSON, а функция json_decode() преобразует объект JSON в объект PHP. Логическое значение, второй параметр функции json_decode() , указывает, какой объект JSON должен быть преобразован. Значение true преобразует объект JSON в ассоциативный массив, а значение false преобразует его в объект PHP.

Например, создать объект StdClass и присвоить его переменной $object . Назовите два значения свойства объекта Mustang и Manang и сохраните их в переменных place1 и place2 . Используйте функцию json_encode() для переменной $object и сохраните значение в переменной $json . Затем используйте функцию json_decode() для переменной $json и используйте логическое значение true в качестве второго параметра. Сохраните значение в переменной $array . Выгрузите переменную с помощью функции var_dump() .

В приведенном ниже примере переменная $object содержит объект StdClass . Функция json_ecode() конвертирует объект в строку JSON. Функция json_decode() конвертирует строку JSON в ассоциативный массив.

#php 7.x  php $object = new StdClass; $object->place1 = "Mustang"; $object->place2 = "Manang"; $json= json_encode($object); $array = json_decode($json, true); var_dump($array); ?> 
array(2) < ["place1"]=>string(7) "Mustang" ["place2"]=> string(6) "Manang" > 

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

Сопутствующая статья — PHP Object

Источник

Оцените статью