Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to access array offset on value of type null

Tags:

php

php-7.4

Migrating from php 7.1 to 7.4. We have like 500 functional tests for an API, and some of them started to fail with an error after the migration was complete. These tests were passing before everywhere, and now fail everywhere - not all, just 39.

Environment information:

  • php 7.4
  • codeception
  • yii2

Stack trace:

...\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

Since ErrorHandler.php:83 this is just catching the error, let's look at the 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

So the $this->config['backend']['api_prefix'] this is a string("v1")

And I dont see where is the issue with this and how to dig into it deeper. Any ideas?

like image 477
Random Name Avatar asked Dec 13 '19 11:12

Random Name


People also ask

What does it mean Trying to access array offset on value of type null?

It means that you tried to access an array using a NULL as an index.

What is array offset in PHP?

It means you're referring to an array key that doesn't exist. "Offset" refers to the integer key of a numeric array, and "index" refers to the string key of an associative array.


2 Answers

Sounds like your variable isn't set.

Check with the following isset calls:

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

You can actually check multiple vars in one isset call (isset($x, $y, $z)), but this will let you see which var specifically is missing

like image 195
delboy1978uk Avatar answered Sep 21 '22 05:09

delboy1978uk


use (??) (double question mark operator) ("null coalescing operator") to avoid unset arrays.

this unit test is giving me "success"

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);
    }
}
like image 20
Yevgeniy Afanasyev Avatar answered Sep 20 '22 05:09

Yevgeniy Afanasyev