在我的网站上,用户可以创建页面,并分配合作者。在我的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
。只要将其重命名为其他名称,您就可以了。