Мне нужно что-то вроде этого:
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 нет встроенной реализации __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, который позволяет объектам работать как массивы.