Оказывается, ответ необычайно прост.Казалось бы, по умолчанию in_array выполняет нестрогое сравнение (эквивалентно операции ==) при тестировании стога сена для иглы.Это означает, что он проверяет, что все свойства равны, что означает, что он начинает проходить граф объекта, и это может привести к неприятностям, если у вас есть круговые ссылки в этом графе.
Функция in_array имеет строгий режим, который, насколько я могу судить, эквивалентен операции ===.Это, кажется, заставляет его проверять ссылки, чтобы увидеть, указывают ли они на один и тот же объект, а не сравнивать все свойства.
Простое изменение кода на:
if (!in_array ($field, $this -> fields, true))
заставляет метод вести себя так, как я хотел, чтобы он вел себя так, чтобы он не вызывал ошибку рекурсии.
Должен сказать, что я немного удивлен, что PHP не поддерживает этот режим по умолчанию.С другой стороны, я не должен удивляться тому, что слабая типизация PHP снова вызвала у меня проблему.:)