debug_print_backtrace的PHP异常错误


PHP unusual bug with debug_print_backtrace

在我的网站上,用户可以创建页面,并分配合作者。在我的Page对象中,我将协作者存储为数组中的User对象。

我还有一个名为collaborators的方法,它接受许多不同的参数类型,以便操作合作者。例如,如果传递了null,它将返回现有的合作者。如果传递了一个数组,它会将数组中的每个用户添加到协作者数组中。

这是我的合作者的方法:

public function collaborators($user = null)
{
    if(is_null($this->collaborators) || $user === true){
        if($this->resource_id() === false){
            $this->collaborators = array();
        } else {
            $result = $this->db->query("
                /** This retrieves collaborator user IDs **/
            ", array(
                $this->resource_id()
            ));
            $this->collaborators = array();
            foreach($result->result() as $user){
                $this->collaborators[] = new User($user->global_user_id);
            }
        }
    }
    if(is_null($user)){
        return $this->collaborators;
    } else if(is_string($user)){
        if(User::is_valid_id($user)){
            $this->collaborators[] = new User($user);
        }
    } else if(is_array($user)){
        foreach($user as $u){
            if($u instanceof User){
                $this->collaborators[] = $u;
            } else if(User::is_valid_id($u)){
                $this->collaborators[] = new User($u);
            }
        }
    } else if($user instanceof User){
        $this->collaborators[] = $user;
    } else {
        var_dump($user);
        throw new InvalidParametersException();
    }
    return $this;
}

在我看来,我使用foreach循环来循环通过合作者来输出它们:

foreach($page->collaborators() as $user){ /** do stuff **/ }

正如您在collaborator方法中看到的那样,如果对象collaborater属性为null,它将从数据库中检索数据。对collaborators()的所有后续调用都从collaborators属性中检索数组。

我有两个问题:

在我看来,我得到了以下回溯:

object(stdClass)#529 (1) { ["global_user_id"]=> string(36) "8c9752fe-40d0-4259-bfe7-a5dcea7cbdfa" } 
Fatal error: Uncaught exception 'InvalidParametersException' with message 'There was an error while trying to process your request. Please try again later.' in application/libraries/objects/MinisiteResource.php:423 
Stack trace: 
#0 application/views/department_site/page.php(153): MinisiteResource->collaborators()
#1 system/core/Loader.php(833): include('/...') 
#2 system/core/Loader.php(419): CI_Loader->_ci_load(Array) 
#3 application/libraries/Pages.php(98): CI_Loader->view('department_site...', Array) 
#4 application/controllers/department/minisite.php(574): Pages->build_page('department_site...', Array) 
#5 [internal function]: Minisite->pages('8', '40') 
#6 system/core/CodeIgniter.php(359): call_user_func_array(Array, Array) 
#7 /v in application/libraries/objects/MinisiteResource.php on line 423

这种回溯没有意义。您可以看到#0正在调用MinisiteResource->collaborators()。这默认为null参数,因此应该从collaborators()方法返回一个数组。然而,由于某种原因,它实际上是从某个地方传递给stdClass对象的。

现在我想知道这个stdClass对象来自哪里,这是我的第二个问题

我添加了一行额外的代码,以捕获stdClass对象:

} else if($user instanceof stdClass) { echo 'Testing'; debug_print_backtrace(); exit; }

但是,当我运行此代码时,我的页面将变为空白。我知道这段代码正在运行,但debug_print_backtrace()正在失败。如果我删除debug_print_backtrace()调用,我会输出"测试"。

显然,如果我能找到stdClass被注入到方法中的位置,我就能解决所有的问题。但主要的问题是debug_print_backtrace()什么都不输出,我不能依赖异常跟踪,因为出于某种原因它不可靠。

为什么debug_print_backtrace()不显示任何内容?到目前为止,有足够多的方法调用,应该至少输出一些东西

如果你需要任何进一步的信息,请告诉我。

您的问题在这里:

foreach($result->result() as $user){
   $this->collaborators[] = new User($user->global_user_id);
}

foreach完成之后,$user仍然挂在存储器中,并且它是适当的stdClass。只要将其重命名为其他名称,您就可以了。