topthink/framework v8.1.4
php 8.4.22
|
return $result ?? ($value ?: $default); |
现在有如下代码
$config->get('worker.http.enable',true);
期望是false结果却是true了,
worker.php 配置如下
return [
'http' => [
'enable' => false,
'host' => '0.0.0.0',
'port' => 8080,
'worker_num' => 4,
'options' => [],
],
发现当有$config->hook有设置的时候就会有问题
判断是不是应该改成 return $result ?? ($value === null ? $default: $value);
重现代码
<?php
declare(strict_types=1);
namespace think;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\TestCase;
class ConfigTest extends TestCase
{
private Config $config;
protected function setUp(): void
{
$this->config = new Config();
}
#[Test]
public function hook_returns_null_falls_back_to_default(): void
{
// 初始化时设置某些 key 为 false
$this->config->set([
'http' => [
'enable' => false,
],
], 'worker');
$this->config->set([
'driver' => 'local',
], 'app');
// 未设置 hook 前,get 正常返回配置值
$this->assertFalse($this->config->get('worker.http.enable'));
$this->assertFalse($this->config->get('worker.http.enable', true));
$this->assertEquals('local', $this->config->get('app.driver'));
// 设置 hook:对 app 组的的配置进行修改
$this->config->hook(function (string $name, $value) {
// 这里可以根据 name 来判断是否要进行更改返回数据
if (str_starts_with($name, 'app.driver')) {
return 'database';
}
// 其他组的配置不受影响 这样写没问题吧?
return $value;
}, 'app');
$this->assertEquals('database', $this->config->get('app.driver'));
// 期望false 返回null
$this->assertFalse($this->config->get('worker.http.enable'));
// 期望false 返回true
$this->assertFalse($this->config->get('worker.http.enable', true));
}
}
topthink/framework v8.1.4
php 8.4.22
framework/src/think/Config.php
Line 191 in ced4837
现在有如下代码
$config->get('worker.http.enable',true);期望是false结果却是true了,
worker.php 配置如下
发现当有
$config->hook有设置的时候就会有问题判断是不是应该改成
return $result ?? ($value === null ? $default: $value);重现代码