PHP Zend Framework-Zend_配置和全局状态

PHP Zend Framework-Zend_配置和全局状态,php,zend-framework,constants,config,Php,Zend Framework,Constants,Config,我正在评估Zend_Config_Ini相对于使用简单常量文件的好处 e、 g- define('DB_HOST',localhost); //versus $config = new Zend_Config_Ini('/path/to/config.ini', 'staging'); echo $config->database->params->host; // prints "dev.example.com" 唯一的问题是,$config不能全局访问。因此,您需

我正在评估Zend_Config_Ini相对于使用简单常量文件的好处

e、 g-

define('DB_HOST',localhost);

//versus

$config = new Zend_Config_Ini('/path/to/config.ini', 'staging');
echo $config->database->params->host;   // prints "dev.example.com"
唯一的问题是,$config不能全局访问。因此,您需要使用Zend_注册表来存储应用程序使用,而无需每次启动


这似乎增加了比需要更多的复杂性。。。。我是否遗漏了一些东西,或者Zend_Config+Zend_Registry从长远来看是一种随着应用程序的增长而更好的技术?

Zend_Config的一个很好的优点是,您不依赖于“PHP源代码文件”;只需要一个.ini文件就可以了——有些人更喜欢修改一个.ini文件而不是PHP文件

通过编程修改.ini/XML文件更容易——有一些类/函数可以做到这一点

有了.ini文件和
Zend_Config
,您还可以使用已经提供的良好功能;例如,节之间的继承(即,您可以有一个“通用”节,以及覆盖某些值的“暂存”和“生产”)


关于
Zend_Config
,可以说明的一点也是一致性:Zend框架和
Zend_应用程序
,已经假设您将有一个配置文件;那么,为什么不是第二个呢?或者甚至重复使用第一个

框架的几个类也是如此,它们可以工作,也可以通过
Zend_Config
的实例进行配置;如果你已经有了这个,它会突然变得更容易;-)



如果必须在带有定义的PHP文件和.ini文件之间进行选择,对于可配置的内容,我可能会选择.ini文件(以及
Zend_Config
+
Zend_Registry

使用带有配置的注册表的主要优点是避免污染全局命名空间。比如说,您希望包含第三方库,并且您的应用程序和库都定义了一个常量DB_主机。不好

此外,Zend Framework中的许多工厂都使用config对象来创建实例
Zend_Db
就是一个很好的例子。您只需传递它
$this->database
,它将获取实例化适配器所需的内容


您还可以使用自定义功能扩展注册表,例如finder方法或类似的东西。检查Fowler提供的。

是的,您是正确的,使用Zend认可的配置方法比定义一系列全局常量更复杂。你得到的好处是

没有全局命名空间冲突 如果需要将应用程序与另一个项目集成,使用全局常量表示应用程序配置可能会导致问题。另一个项目拥有名为
DB\u HOST
的常量的可能性有多大?使用您的混合系统的开发人员如何区分哪些常量是应用程序的配置,哪些常量是集成应用程序的配置

以他人的工作为基础 因此,您有一个包含所有配置值的文件。您将如何将其部署到不同的环境中?(制作、登台等)你很可能是一个聪明的人,可以想出一个解决方案,但是另一个进入你项目的开发人员如何知道这个解决方案是如何工作的呢?应用程序中的其他模块如何知道如何读取全局配置


Zend_Config
已经“解决”了许多问题。通过预先增加一点复杂性和抽象性,您可以获得一条已知的前进道路,并且可以花更多的时间解决应用程序的问题,而不是发明和支持另一个配置系统。

感谢您的快速回答。我已经使用Zend_Config一段时间了,但开始重新思考,因为我接管的另一个应用程序使用标准常量PHP文件。事实上,我发现它在很多方面都更干净。但我同意你的观点,并将坚持使用Zend_配置+Zend_注册表。它只是在各处添加了更多的代码行;但是如果您只有几个配置文件,可能没有那么多行;;在使用了大量的defines和Zend_Config之后,我不会选择第一个解决方案,至少在“一般情况”中不是这样,我认为全局名称空间是使用它的最佳点。s