Попытка доступа к смещению массива по значению типа null

Переход с php 7.1 на 7.4. У нас есть около 500 функциональных тестов для API, и некоторые из них начали давать сбой с ошибкой после завершения миграции. Эти тесты раньше проходили везде, а теперь проваливаются везде - не все, а всего 39.

Информация об окружающей среде:

  • PHP 7.4
  • кодовое восприятие
  • yii2

Трассировки стека:

...\api\vendor\codeception\codeception\src\Codeception\Subscriber\ErrorHandler.php:83
...\api\tests\functional\SomeFileHereCest.php:72
...\api\vendor\codeception\codeception\src\Codeception\Lib\Di.php:127
...\api\vendor\codeception\codeception\src\Codeception\Test\Cest.php:138
...\api\vendor\codeception\codeception\src\Codeception\Test\Cest.php:97
...\api\vendor\codeception\codeception\src\Codeception\Test\Cest.php:80
...\api\vendor\codeception\codeception\src\Codeception\Test\Test.php:88
... more stuff here, not important

Так как ErrorHandler.php:83 это просто отлов ошибки, давайте посмотрим на SomeFileHereCest.php:72:

// declaration of the apiPrefix variable in the class.
protected $apiPrefix;
//...

public function _before(FunctionalTester $I)
{
    $this->apiPrefix = $this->config['backend']['api_prefix']; // this is the line 72
    //... more similar stuff later

Итак, $this->config['backend']['api_prefix'] это строка ("v1")

И я не вижу, в чем здесь проблема и как копнуть глубже. Любые идеи?


person Random Name    schedule 13.12.2019    source источник
comment
сначала проверьте isset($this->config), isset($this->config['backend']) и isset($this->config['backend']['api_prefix'])   -  person delboy1978uk    schedule 13.12.2019
comment
Ладно, хз почему, но он не загрузил конфиг в этот файл - даже то, что код вообще не изменился. Так что, если вы создадите ответ из этого, я могу принять его как хороший, потому что я мог бы решить проблему с этим, сначала вызвав здесь функцию загрузки функции конфигурации, спасибо!   -  person Random Name    schedule 13.12.2019


Ответы (2)


Похоже, ваша переменная не установлена.

Проверьте следующие вызовы isset:

isset($this->config); 
isset($this->config['backend']);
isset($this->config['backend']['api_prefix']);

На самом деле вы можете проверить несколько переменных в одном вызове isset (isset($x, $y, $z)), но это позволит вам увидеть, какая именно переменная отсутствует.

person delboy1978uk    schedule 13.12.2019

используйте (??) (double question mark operator) (null coalescing operator), чтобы избежать неустановленных массивов.

этот модульный тест дает мне успех

class PhpTest extends TestCase
{
    public function test_php_74()
    {
        //Trying to access array offset on value of type null

        $this->assertSame('7.4.9', phpversion());

        $a = null;
        $this->assertTrue($a ?? true);
        $this->assertTrue($a['a'] ?? true);
        $this->assertTrue($a['a']['a'] ?? true);

        $a = [];
        $this->assertSame([], $a);
        $this->assertTrue($a['a'] ?? true);
        $this->assertTrue($a['a']['a'] ?? true);
    }
}
person Yevgeniy Afanasyev    schedule 27.08.2020