Skip to content

当config设置了hook的时候如果value等于false,结果得到的却是null #3207

Description

@runphp

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有设置的时候就会有问题

Image

判断是不是应该改成 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));
    }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions