PHP возвращает объект как ноль время от времени и непреднамеренно - PullRequest
1 голос
/ 21 апреля 2020

У нас есть 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

Кто-нибудь испытывал то же самое и имеет намеки на то, что может вызвать такую ​​ошибку и как ее исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...