使用debug_print_backtrace的PHP异常错误

时间:2014-10-23 11:56:36

标签: php debugging

在我的网站上,用户可以创建页面并分配协作者。在我的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 **/ }

正如您在协作者方法中所看到的,如果对象协作者属性为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->协作者()。这默认为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()不显示任何内容?到目前为止,有足够的方法调用,至少应该输出

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

1 个答案:

答案 0 :(得分:2)

你的问题在这里:

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

foreach完成后$user仍会挂起内存,这是正确的stdClass。只需将其重命名为其他内容即可。