отладка — необычная ошибка PHP с 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 **/ }

Как вы можете видеть в методе коллаборации, если свойство коллаборатора объекта равно нулю, оно извлекает данные из базы данных. Все последующие звонки collaborators() извлекает массив из collaborators имущество.

У меня 2 проблемы:

Я получаю следующий след на мой взгляд:

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() метод. Тем не менее, по какой-то причине его фактически передают stdClass объект откуда-то

Теперь я хочу знать, где это stdClass объект исходит, и это моя вторая проблема

Я добавляю дополнительную строку кода, чтобы поймать stdClass объекты:

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

Однако, когда я запускаю этот код, моя страница становится пустой. Я точно знаю, что этот сегмент кода работает, но debug_print_backtrace() терпит неудачу. Если я удалю debug_print_backtrace() звоните, я получаю ‘Testing’ выводится.

Очевидно, если я смогу узнать, где stdClass вводится в метод, я могу решить все свои проблемы. Но главная проблема debug_print_backtrace() ничего не выводит, и я не могу полагаться на трассировку исключений, потому что по какой-то причине она не надежна.

Почему бы debug_print_backtrace() ничего не отображать? До этого момента определенно достаточно вызовов методов, которые должны выводить хоть что-то

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

0

Решение

Ваша проблема здесь:

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

После foreach готово $user все еще висит в памяти, и это правильное stdClass, Просто переименуйте его во что-то другое, и все в порядке.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector