Выяснилось, что в предложенном мной виде функция objectToArray неуниверсальна ☹️



Для объекта встроенного класса (например, DateTimeImmutable или stdClass) вызов Closure::call бросит ошибку уровня E_WARNING и вернёт null, так как замыкание нельзя привязать к области видимости встроенного класса.



"Встроенность" можно проверить через ReflectionClass::isInternal, а можно просто подавить ошибку и обработать null, выбирайте по религии ситуации 😉



В чистом виде get_object_vars применима к любым объектам и всегда возвращает массив публичных нестатических свойств. У объектов встроенных классов кроме stdClass он, как правило, пустой.



Обновлённый вариант функции с рефлексией https://3v4l.org/2mtXC и без https://3v4l.org/RqDHu.