在我的网站上,用户可以创建页面并分配协作者。在我的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()
不显示任何内容?到目前为止,有足够的方法调用,至少应该输出
如果您需要任何进一步的信息,请告诉我。
答案 0 :(得分:2)
你的问题在这里:
foreach($result->result() as $user){
$this->collaborators[] = new User($user->global_user_id);
}
foreach
完成后$user
仍会挂起内存,这是正确的stdClass
。只需将其重命名为其他内容即可。