Мы получаем уведомление PHP на нашем производственном сервере:
[PHP Notice] Trying to get property of non-object
В нашем коде у нас есть два массива Foo
объекты каждый с pos
переменная-член:
$locked_foos
$unlocked_foos
Я бегу цикл, чтобы заказать и объединить эти Foo
s в новый результат массива:
$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.
Я все еще получаю ту же ошибку, и не выдается исключение, как это возможно?
Оказывается, моя логика была все фанки
// 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)
){
..
}
которая является правильной логикой (и, возможно, более читаемой).
Других решений пока нет …