Как написать это в PHP 7.2? - PullRequest
       33

Как написать это в PHP 7.2?

0 голосов
/ 22 октября 2018

У меня есть этот кусок кода:

private function _resolveCustomEntries($fields)
{
    foreach ($fields as &$value) {
        if (array_key_exists('custom', $value)) {
            if (method_exists($this, $value['custom'])) {
                $value['custom'] = $this->$value['custom'](); //variableInterpolation
            }
        }
    }
    return $fields;
}

Я запустил проверку совместимости PHP 7.2, и он пожаловался здесь на "variableInterpolation" на отмеченной строке.Когда я запускаю этот код, журнал PHP сообщает мне следующее:

ERR (3): Примечание: преобразование массива в строку в /public_html/lib/KiTT/Payment/Widget.php в строке 217

Это та же строка, в которой проверка «variableInterpolation» не удалась.Так как бы мне переписать этот код, чтобы он работал в PHP 7.2?

Спасибо!

Решение:

$value['custom'] = $this->$value['custom']();

должно выглядеть следующим образом:

$value['custom'] = $this->{$value['custom']}(); 

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Это приведет к преобразованию массива в строку в 7,2

class bob{


    function foo(){
        return 'bar';
    }

    function getFoo(){

        $value['custom'] = 'foo';

        $value['custom'] = $this->$value['custom']();

        return $value['custom'];
    }


}

$bob = new Bob();

var_dump($bob->getFoo());

Но в 5,6 он выполнится очень хорошо.

Затем я изменил фрагмент на этот, не вызывая метод напрямуюприведение ключа массива к имени функции, но инициализация строковой (надеюсь, в вашем коде проверки типов нет) переменной с именем функции первой:

class bob{


    function foo(){
        return 'bar';
    }

    function getFoo(){

        $value['custom'] = 'foo';

        $functionName = $value['custom'];

        $value['custom'] = $this->$functionName();

        return $value['custom'];
    }


}

$bob = new Bob();

var_dump($bob->getFoo());

Это будет нормально работать в php 7.2

0 голосов
/ 22 октября 2018

Дело в том, что переменные порядка исключаются.

С

class x {
  public function y() {
    echo 'ok';
  }
}
$x = new x();
$y = array('i' => 'y');

Тогда

$x->$y['i']();

Сбой, потому что PHP сначала пытается привести переменную $yв строку и получить соответствующее свойство $x (которого, кстати, не существует), затем пытается получить индекс 'i' или это несуществующее свойство, а затем пытается запустить его как вызываемый.

Следовательно, 3 ошибки:

Преобразование массива в строку

Неопределенное свойство x :: $ Array

Имя функции должно быть строкой (nda: возвращается неопределенное свойствоNULL)

Вместо этого фигурные скобки переменной для установки порядка разрешения:

$x->$y['i']();

Будет работать.Так что используйте $this->{$value['custom']}()

0 голосов
/ 22 октября 2018

Вы можете попробовать переписать свой код, используя сложный (фигурный) синтаксис, вы можете прочитать больше об этом здесь .

Ваш код будет выглядеть примерно так.

$value['custom'] = $this->{$value['custom']}();

Редактировать: перемещать фигурные скобки в правильные позиции.

...