mrN*_*mrN 1 php object zend-search-lucene
我正在使用Zend_Search_Lucene来索引我的网站.我的网站索引并不完全相似.有些人有很少的领域,有些有很多领域.我试图通过不同类型的表创建一个类似的索引,这就是我遇到这种错误的原因.
现在,当我显示结果时.我调用了一些字段,这些字段在生成错误的所有结果中都不存在.我试图检查它,isset
但它似乎完全跳过了这一行.
foreach ($hits as $hit) {
$content .= '<div class="searchResult">';
$content .= '<h2>';
$title = array();
if(isset($hit -> name)) $title[] = $hit -> name;
if(isset($hit -> title)) $title[] = $hit -> title;
// This is the part where i get fatal error.
$content .= implode(" » ",$title);
$content .= '</h2>';
$content .= '<p>'.$this->content.'</p>';
$content .= '</div>';
}
Run Code Online (Sandbox Code Playgroud)
如何检查是否有任何诸如$hit -> name
存在于$hit
您遇到的问题非常具体,与Zend_Lucene_Search
实现有关,而不是字段/属性存在检查.
在你的循环中,$hit
是一个类的对象Zend_Search_Lucene_Search_QueryHit
.在编写表达式时$hit->name
,对象调用magic __get
函数为您提供名为的"虚拟属性" name
.如果要提供的值不存在,则这个魔术函数会抛出异常.
通常,当一个类实现__get
为方便时,它也应该实现__isset
为方便(否则你不能真正使用isset
这样的虚拟属性,因为你已经找到了困难的方法).由于这个特定类没有实现__isset
恕我直言,name
如果相关数据不存在,你将永远无法在不触发异常的情况下盲目获取"属性".
property_exists
所有其他形式的反思也无济于事,因为我们不是在谈论这里的不动产.
解决这个问题的正确方法是稍微迂回:
$title = array();
$names = $hit->getDocument()->getFieldNames();
if(in_array('name', $names)) $title[] = $hit -> name;
if(in_array('title',$names)) $title[] = $hit -> title;
Run Code Online (Sandbox Code Playgroud)
总而言之,我认为这是ZF中的一个错误,可能会提交一份报告,要求__isset
在应该的类型上适当地实施魔术方法.