Периодическая ошибка «Попытка получить свойство необъекта»

Мы получаем уведомление PHP на нашем производственном сервере:

[PHP Notice] Trying to get property of non-object

В нашем коде у нас есть два массива Foo объекты каждый с pos переменная-член:

$locked_foos
$unlocked_foos

Я бегу цикл, чтобы заказать и объединить эти Foos в новый результат массива:

$cur_pos = 1;
$result  = [];

// Extract first locked and unlocked foos
$locked_foo = reset($locked_foos);
$unlocked_foo = reset($unlocked_foos);

// While there is either an unlocked or locked foo..
while($locked_foo || $unlocked_foo){

// If there is no unlocked (thus must be a locked) or the locked's position is current..
if(!$unlocked_foo || $locked_foo->pos == $cur_pos){ // **Error**

// Use locked, set pos and iterate locked
$locked_foo->pos = $cur_pos;
$result[] = $locked_foo;

$locked_foo = next($locked_foos);
}
// Else..
else {

// Use unlocked, set pos and iterate unlocked
$unlocked_foo->pos = $cur_pos;
$result[] = $unlocked_foo;

$unlocked_foo = next($unlocked_foos);
}

// Iterate current position
$cur_pos++;
}

Ошибка происходит в показанной строке.

Я предполагаю, что ошибка возникает, когда один из $locked_foos установлено что-то отличное от объекта, поэтому я добавил строки:

  if($locked_foo && !is_object($locked_foo)){
throw new Exception('FOOOO!');
}

Просто внутри цикла while.

Я все еще получаю ту же ошибку, и не выдается исключение, как это возможно?

0

Решение

Оказывается, моя логика была все фанки

// If there is no unlocked (thus must be a locked) or the locked's position is current..
if(!$unlocked_foo || $locked_foo->pos == $cur_pos){ // **Error**

// Use locked, set pos and iterate locked
$locked_foo->pos = $cur_pos;
$result[] = $locked_foo;

$locked_foo = next($locked_foos);
}

В редком случае $locked_foos не хватило элементов раньше $unlocked_foos, $unlocked_foo был положительным и $locked_foo = false,

Я изменил if условие для

// If there is a locked with the current position or there is no unlocked..
if(
$locked_foo &&
($locked_foo->pos == $cur_pos || !$unlocked_foo)
){
..
}

которая является правильной логикой (и, возможно, более читаемой).

1

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

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

По вопросам рекламы [email protected]