Возможно ли переопределить поведение print_r для объекта ArrayIterator в PHP?

#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:

И почему вы не используете метод getArrayCopy?

ie.

 print_r($yourIterator->getArrayCopy());
  

Ответ №4:

Если вы не думаете, что это так, если не используете PHP Runkit но я бы не рекомендовал этого, поскольку это изменило бы ожидаемое поведение, которое ожидает ваш пользователь.

другим хорошим способом было бы создать свою собственную функцию (например: my_print_r() { /* some code */ } или использовать __toString() магический метод.

Для чего это?

Комментарии:

1. По разным причинам я изменил некоторый существующий код, чтобы возвращать ArrayIterator, а не фактический массив. У меня есть куча утилит для тестирования / отладки, которые предполагают, что они получают массив, поэтому я надеялся, что новый класс на основе ArrayIterator сможет имитировать массив всеми способами, чтобы они работали как есть.

2. Хммм, хорошо. Итак, тот факт, что print_r на самом деле не печатается одно и то же, не нарушает ваш код, вы просто хотите, чтобы ваш отладочный дисплей не изменялся.

3. На данный момент, да. Я надеялся, что возможно заставить объект обрабатываться как массив во всех отношениях. У меня есть некоторый код, который всегда возвращал массив, но теперь (в некоторых случаях) должен возвращать объект, который является оболочкой вокруг итеративной структуры данных c.

4. Возможно, недостаток вашего кода заключается в том, что функция возвращает значения другого типа.

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