У нас есть PHP код в работе, который иногда завершается с ошибкой «Вызов функции-члена при нулевом значении», хотя один и тот же путь к коду выполняется несколько раз до этого в одном вызове. У нас есть тест, который последовательно воспроизводит ошибку при одном и том же запуске l oop.
. Я уже доказал, что объект правильно создается на фабрике, даже если он возвращается как нулевой. Фабричный метод не должен возвращать ноль в любом случае, как указано в DocBlock. Этот вопрос не относится к типам возвращаемых значений, которые могут быть обнуляемыми, или что-то в этом роде.
Процесс не превышает ограничения памяти или времени выполнения, и я уже пытался отключить сборщик мусора, но не повезло. Ошибка происходит как в PHP 7.0, так и в 7.3 на Debian, не пробовал на других версиях или операционных системах.
Мне не разрешено вставлять здесь настоящий код, но я написал простой макет для объяснения в Подробнее. Пожалуйста, имейте в виду, что этот демонстрационный код не приведет к ошибке, он просто должен показать общую структуру программы, которая сталкивается с этой ошибкой.
// Three placeholder classes with common methods
class Bender
{
public function common()
{
echo "Bend, bend!" . PHP_EOL;
}
}
class Clamper
{
public function common()
{
echo "Clamp, clamp!" . PHP_EOL;
}
}
class Worker
{
public function common()
{
echo "Work, work!" . PHP_EOL;
}
}
// abstract class with static factory to produce objects
abstract class MomCorp
{
/**
* Factory to create one of several objects
*
* @param string $name
* @return Bender|Clamper|Worker
*/
public static function factory($name)
{
$type = self::managementDecision($name);
switch ($type)
{
case "bender":
$robot = new Bender();
break;
case "clamper":
$robot = new Clamper();
break;
default:
$robot = new Worker();
}
// optional QA works flawlessly here, object is fine all the time!
// $robot->common();
return $robot;
}
public static function managementDecision($name)
{
// irrelevant magic happens on $name here
return "bender";
}
}
foreach (['Rodriguez', 'Angle-ine', 'Flexo', 'Billie'] as $newName)
{
echo "$newName: ";
// The next two lines break after some loops - why?
// The perfectly functional object in factory gets returned as null
$bot = MomCorp::factory($newName);
$bot->common();
}
// SAMPLE OUTPUT
// Rodriguez: Bend, bend!
// Angle-ine: Bend, bend!
// Flexo: Bend, bend!
// Billie: Call to a member function common() on null
Кто-нибудь испытывал то же самое и имеет намеки на то, что может вызвать такую ошибку и как ее исправить?