检查对象类型变量中是否存在字段/属性

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(" &raquo; ",$title);
      $content .= '</h2>';
      $content .= '<p>'.$this->content.'</p>';
    $content .= '</div>';
}
Run Code Online (Sandbox Code Playgroud)

如何检查是否有任何诸如$hit -> name存在于$hit

Jon*_*Jon 5

您遇到的问题非常具体,与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在应该的类型上适当地实施魔术方法.