尝试访问 null 类型值的数组偏移量
Trying to access array offset on value of type null
从 php 7.1 迁移到 7.4。我们对 API 进行了大约 500 次功能测试,其中一些在迁移完成后开始失败并出现错误。这些测试以前到处都通过,现在到处都失败了 - 不是全部,只有 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")
而且我看不出问题出在哪里以及如何更深入地研究它。有什么想法吗?
听起来你的变量没有设置。
检查以下 isset 调用:
isset($this->config);
isset($this->config['backend']);
isset($this->config['backend']['api_prefix']);
您实际上可以在一个 isset 调用中检查多个变量 (isset($x, $y, $z)
),但这会让您看到具体缺少哪个变量
使用 (??) (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);
}
}
与PHP7.4 Issue有关。
解决方案是我们可以将 isset 放在 PHP 或 Laravel Blade 中
旧代码
@foreach ($widgets->get('dashboard') as $widget)
{!! $widget->render() !!}
@endforeach
使用 isset 更新新代码
@if(isset($Widget))
@foreach ($widgets->get('dashboard') as $widget)
{!! $widget->render() !!}
@endforeach
@endif
从 php 7.1 迁移到 7.4。我们对 API 进行了大约 500 次功能测试,其中一些在迁移完成后开始失败并出现错误。这些测试以前到处都通过,现在到处都失败了 - 不是全部,只有 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")
而且我看不出问题出在哪里以及如何更深入地研究它。有什么想法吗?
听起来你的变量没有设置。
检查以下 isset 调用:
isset($this->config);
isset($this->config['backend']);
isset($this->config['backend']['api_prefix']);
您实际上可以在一个 isset 调用中检查多个变量 (isset($x, $y, $z)
),但这会让您看到具体缺少哪个变量
使用 (??) (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);
}
}
与PHP7.4 Issue有关。 解决方案是我们可以将 isset 放在 PHP 或 Laravel Blade 中 旧代码
@foreach ($widgets->get('dashboard') as $widget)
{!! $widget->render() !!}
@endforeach
使用 isset 更新新代码
@if(isset($Widget))
@foreach ($widgets->get('dashboard') as $widget)
{!! $widget->render() !!}
@endforeach
@endif