Проблема, с которой вы столкнулись, очень специфична и связана с реализацией Zend_Lucene_Search
, а не с проверкой поля / свойства в целом.
В вашем цикле $hit
является объектом класса Zend_Search_Lucene_Search_QueryHit
.Когда вы пишете выражение $hit->name
, объект вызывает функцию magic __get
, чтобы получить «виртуальное свойство» с именем name
.Именно эта магическая функция выдает исключение, если значение, которое нужно указать, не существует.
Обычно, когда класс реализует __get
для удобства, он также должен реализовывать __isset
для удобства (в противном случае выне может реально использовать isset
на таких виртуальных свойствах, как вы выяснили, трудный путь).Поскольку данный конкретный класс не реализует __isset
, как имхо, вы никогда не сможете получить «свойство» * 1021 вслепую без вызова исключения, если соответствующие данные не существуют.
property_exists
и все другие формы рефлексии также не помогут, поскольку мы не говорим о недвижимости здесь.
Надлежащий способ решить эту проблему - это небольшая обходная дорога:
$title = array();
$names = $hit->getDocument()->getFieldNames();
if(in_array('name', $names)) $title[] = $hit -> name;
if(in_array('title',$names)) $title[] = $hit -> title;
Все сказаноЯ считаю это ошибкой в ZF и, возможно, отправлю отчет с просьбой о правильном применении магического метода __isset
для типов, которые должны быть.