php 7.3 - константы классов в качестве значений параметров по умолчанию сбои - PullRequest
0 голосов
/ 26 января 2019

У меня есть некоторый код, который работал долгое время, но теперь вызывает недоумение.Я должен предположить, что это было вызвано моим переходом на php 7.3, но я не могу найти никаких ссылок, объясняющих, что происходит.

У меня есть метод в классе, который выглядит примерно так:

class Foo {

    function bar($param = OtherClass::MY_CONSTANT) {
        logger(__METHOD__);
        logger(OtherClass::MY_CONSTANT);
        logger($param);
        logger('ready to do stuff');

        // does stuff
    }
}

Где OtherClass :: MY_CONSTANT = 1.

Когда я вызываю этот метод из другого класса:

$foo = new Foo();
$foo->bar();

, вывод выглядит примерно так:

DEBUG - Foo::bar
DEBUG - 1

и затем выполнение php резко останавливается, даже не вызывая мою зарегистрированную функцию завершения работы.Я могу использовать константу класса непосредственно в теле метода, но я не могу использовать параметр, установленный в значение константы класса по умолчанию.

Если я изменю метод на

function bar($param = 1) {

все работает отлично.

Кроме того, если я передаю константу при вызове метода, он работает:

$foo = new Foo();
$foo->bar(OtherClass::MY_CONSTANT);

Я получаю счастливое

DEBUG - Foo::bar
DEBUG - 1
DEBUG - 1
DEBUG - ready to do stuff

и выполнение продолжается нормально.

Что-то в использовании константы класса по умолчанию делает переменную ядовитой, хотя я могу без проблем использовать константу класса в методе.

Iпопытался создать простой пример из одного файла, чтобы воссоздать эту проблему, но он работал просто отлично.Aargh.

Что-то изменилось в php 7.3, что могло бы вызвать такое поведение?Я только что обновился до 7.3.1, но проблема осталась.Есть ли лучшая практика, которую я должен использовать?

РЕДАКТИРОВАТЬ, ЧТОБЫ ДОБАВИТЬ:

После нескольких часов, пытаясь создать простой случай, чтобы воспроизвести это, я должен идти дальше.Соответствующие факторы включают в себя:

  • работает в php-fpm
  • код работает после закрытия подключения к браузеру.
  • даже константы в том же классе (self::MY_CONSTANT) создать ядовитые переменные

Моим решением было откатиться до php 7.2.14, который работает правильно.Я могу предположить это только в ошибке в php 7.3.

1 Ответ

0 голосов
/ 26 января 2019

В качестве обходного пути вы можете сделать это следующим образом:

function bar($param = null) {
    if ($param === null) {
        $param = OtherClass::MY_CONSTANT;
    }
    logger(__METHOD__);
    logger(OtherClass::MY_CONSTANT);
    logger($param);
    logger('ready to do stuff');

    // does stuff
}

Это предполагает, что null не является допустимым значением для параметра;замените его другим недопустимым значением, если оно есть.Если параметром может быть что угодно, этот обходной путь не будет работать.

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