PHP Как перезаписать объект, приведенный к массиву, например: (массив) $ объект с пользовательской функцией

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

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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Converting to array

For any of the types integer, float, string, boolean and resource, converting a value to an array results in an array with a single element with index zero and the value of the scalar which was converted. In other words, (array)$scalarValue is exactly the same as array($scalarValue).

If an object is converted to an array, the result is an array whose elements are the object's properties.....

....

Решение

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

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

Другие вопросы по теме