PHP Как написать объект приведенный к массиву, как: (массив) $ объект с пользовательской функцией - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно что-то вроде этого:

class MyClass {
    $a = 'A';
    $b = 'B';
    public function __to_array(){
        $r = (array) $this;
        $r['ab'] = 'AB';
        return $r;
    }
};

$x = new MyClass();

$x_as_array = (array) $x; 

В последней строке мне не нужно возвращать ['a' => 'A', 'b' => 'B'], но мне нужно переписать это значение по умолчаниюприведение к моей пользовательской функции __to_array.

1 Ответ

2 голосов
/ 17 мая 2019

PHP не имеет нативной реализации __toArray(), как у __toString().

Если вы посмотрите документы PHP для преобразования в строку , вы увидите, что магический метод __toString() явно упоминается как способ переопределения реализации по умолчанию.

Однако в документации, касающейся приведения типов к массивам , четко указывается, что происходит при преобразовании объекта в массив, без упоминания каких-либо магических методов (выделено мной)

Преобразование в массив

Для любого из типов integer, float, string, boolean и resource преобразование значения в массив приводит к массиву с единственным элементом с нулевым индексом и значением скаляра, который был преобразован. Другими словами, (массив) $ scalarValue в точности совпадает с массивом ($ scalarValue).

Если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта .....

....

Решение

Простым решением является реализация метода ->toArray() в вашем классе - то, что делают многие популярные реализации коллекций (включая Laravel Collection)

Другое решение, которое может сработать, - это заставить ваш класс расширить класс ArrayObject, который позволяет объектам работать как массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...