Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在我的配置类中寻找设置默认值的更好方法?_Php - Fatal编程技术网

Php 在我的配置类中寻找设置默认值的更好方法?

Php 在我的配置类中寻找设置默认值的更好方法?,php,Php,我在很多项目中重用了配置类(底部的简化代码)。它通常在我的应用程序引导文件中实例化一次,并存储在容器类中,我通过静态的“makeThis()”方法调用将其作为依赖项注入到对象中 因为每次执行我的应用程序时都会实例化它,所以我希望尽可能简化它。重复:我希望这个过程尽可能高效。 我在实例化时在config::$defaults数组中指定了默认配置值。我要特别优化的是load\u conf\u environment()函数中的属性分配。您将在这个函数中找到代码注释,进一步说明我的需求 下面的代码应该

我在很多项目中重用了配置类(底部的简化代码)。它通常在我的应用程序引导文件中实例化一次,并存储在容器类中,我通过静态的“makeThis()”方法调用将其作为依赖项注入到对象中

因为每次执行我的应用程序时都会实例化它,所以我希望尽可能简化它。重复:我希望这个过程尽可能高效。

我在实例化时在
config::$defaults
数组中指定了默认配置值。我要特别优化的是
load\u conf\u environment()
函数中的属性分配。您将在这个函数中找到代码注释,进一步说明我的需求

下面的代码应该足够清晰(对于任何能够提供有效答案的人来说)来说明类是如何工作的。我正在寻找一种富有想象力和高效的方法来处理这个操作,如果你能支持你的说法,我并不反对大规模的重构

最后,让我先排除一个建议:不,我对使用常量作为目录路径值不感兴趣。我过去经常这样做,但这使单元测试变得困难


更新:

  • 我已经考虑使用来确定默认值 值的类型,然后强制转换传递的值,但根据 php文档说明这不是一个好的解决方案
  • 目前,我正在数组中存储不同的配置指令名称 通过键入并检查哪个数组包含该指令 命名并执行类型转换,或基于此分配值。这对我来说似乎“丑陋” 如果可能的话,这就是我想要逃避的

更新2:

让配置值匹配默认值的变量类型是理想的情况,但我只是想让它符合我的想法。。。这可能根本不重要。也许编码器有责任提供有效的配置值?有人对此有什么想法吗



处理默认值
在从配置文件加载值之后,为需要它们的指令设置默认值有什么原因吗

既然默认值已经在
\uu构造中硬编码,为什么不将它们移到
$vals
属性中,避免以后需要设置它们呢?这样,您的
load_conf_environment
方法将覆盖该指令已经存在的默认值

验证类型
这是我将在每个指令的setter方法中强制执行的。每个setter都应该使用
is.*
函数或setter参数中的类型暗示来验证值的类型,并相应地抛出异常。我可能会要求每个指令都有一个setter。这是更多的工作,但更干净,100%可执行

处理应用程序目录指令(一个选项)

  • 在构造中,如果调用了
    set_app_path
    ,则运行VAL属性并调用app_dir指令上的
    set_app_dir_指令
    方法(见下文),以便它们以app path作为前缀
  • 制作一个新的
    set\u-app\u-dir\u指令
    方法:

    public function set_app_dir_directive($key, $val)
    {
        $this->vals[$key] = $this->app_dir . '/' . $val;
    }
    
    // then...
    
    public function load_conf_environment($cfg)
    {
        ...
    
        foreach ($cfg as $name => $val) {
    
            $method = "set_$name";
            if (method_exists($this, $method)) {
                ...
            }
    
            if ($this->is_app_dir_directive($name)) {
                $this->set_app_dir_directive($name, $val);
                continue;
            }
    
            // Continue storing vals.
            ...
        }
    }
    

  • +谢谢你比我聪明。既然你提到了,我想不出一个好的理由。我面临的主要问题是如何过滤新值,使它们与默认值的类型相同。呵呵,这就是我如何做到这一点的——我试图消除尽可能多的setter方法,以缩短代码。我想如果我有一堆setter方法,一切都会解决,但我希望找到一种不用它们的方法。但是,如果我想处理一堆不同类型的变量,这可能是不可能的。有一次,我实现了_set()来捕获不同的赋值,而不使用setter,但问题是我也不希望_set()可以在load_conf_environment()方法之外赋值。感谢您深入研究代码——我知道这需要了解其他人的想法。
    public function set_app_dir_directive($key, $val)
    {
        $this->vals[$key] = $this->app_dir . '/' . $val;
    }
    
    // then...
    
    public function load_conf_environment($cfg)
    {
        ...
    
        foreach ($cfg as $name => $val) {
    
            $method = "set_$name";
            if (method_exists($this, $method)) {
                ...
            }
    
            if ($this->is_app_dir_directive($name)) {
                $this->set_app_dir_directive($name, $val);
                continue;
            }
    
            // Continue storing vals.
            ...
        }
    }