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