#php #arrays
#php #массивы
Вопрос:
У меня есть класс PHP, который расширяет ArrayIterator, и в нем реализованы все необходимые методы, так что он ведет себя как массив.
Это отлично работает для таких вещей, как foreach
циклы, но при вызове print_r
этого по-прежнему выводятся переменные объекта, а не выводится как массив.
Есть ли какой-нибудь способ переопределить это поведение, чтобы вызов print_r
(и я предполагаю var_dump
) выводил пользовательский вывод для этого объекта?
Комментарии:
1. Для чего это стоит: phpsadness.com/sad/8
Ответ №1:
Нет, потому что он предназначен для предоставления информации о переменной (т. Е. он используется для отладки), а не просто для предоставления некоторого ее строкового представления.
__toString
Хотя вы можете перезаписать и использовать echo
.
Ответ №2:
Начиная с PHP 5.6, был добавлен волшебный метод __debuginfo
, если вы его реализуете, вы сможете переопределить поведение var_dump
и print_r
.
seh здесь:http://php.net/manual/language.oop5.magic.php#object.debuginfo
Ответ №3:
Ответ №4:
Если вы не думаете, что это так, если не используете PHP Runkit
но я бы не рекомендовал этого, поскольку это изменило бы ожидаемое поведение, которое ожидает ваш пользователь.
другим хорошим способом было бы создать свою собственную функцию (например: my_print_r() { /* some code */ }
или использовать __toString()
магический метод.
Для чего это?
Комментарии:
1. По разным причинам я изменил некоторый существующий код, чтобы возвращать ArrayIterator, а не фактический массив. У меня есть куча утилит для тестирования / отладки, которые предполагают, что они получают массив, поэтому я надеялся, что новый класс на основе ArrayIterator сможет имитировать массив всеми способами, чтобы они работали как есть.
2. Хммм, хорошо. Итак, тот факт, что
print_r
на самом деле не печатается одно и то же, не нарушает ваш код, вы просто хотите, чтобы ваш отладочный дисплей не изменялся.3. На данный момент, да. Я надеялся, что возможно заставить объект обрабатываться как массив во всех отношениях. У меня есть некоторый код, который всегда возвращал массив, но теперь (в некоторых случаях) должен возвращать объект, который является оболочкой вокруг итеративной структуры данных c.
4. Возможно, недостаток вашего кода заключается в том, что функция возвращает значения другого типа.
5. Да, кажется, решение будет заключаться в том, чтобы обернуть обычные массивы в объект и всегда возвращать это, вместо того, чтобы пытаться замаскировать другой объект под массив.