使用PHP MVC项目,我有一些模型类可以从RESTful Web服务加载数据,这需要一个API密钥。我想将必要的API密钥存储在我的应用程序的中央配置文件中。
要将API密钥提供给我的班级,哪种方法最佳?
$GLOBALS
中,以便可以在使用它的模型类中直接访问它。方法#2似乎最适合OOP和代码重用,但方法#1非常方便。我通常使用方法#2,但我想知道方法#1是否通常被认为是$GLOBALS
的可接受用途,即使在OOP MVC环境中也是如此。
答案 0 :(得分:3)
Symfony 1.4使用sfConfig :: get('my_value'),它就像你的第一个选项,只包装在一个对象中。
Symfony 2使用dependency injection来减少耦合,这就像你的第二个选择。请务必查看this link以获取有关依赖注入的详细说明。
然而,减少耦合会增加复杂性。所以,这真的是一个权衡。我认为重点是在您的应用程序中保持一致。无论使用哪种方法都可以更改,只要您的使用一致。
我会选择依赖注入。如果您一直使用它,它不仅易于使用,而且更有可能导致可重用代码。计算机中最慢的部分是开发人员,因此我尽可能地尝试构建高质量,可重用的组件。我还应该注意,如果您选择通过添加单元测试来提高代码的质量和一致性,那么使用依赖注入会使构建单元测试变得更加容易得多。
希望有帮助...
答案 1 :(得分:1)
我说这里最好的是第三种选择:使用全局常量。
define('API_KEY', 'foobar');
这是合理的,因为在应用程序的生命周期中,此常量的值实际上将保持不变。在这种情况下,常数更好,因为不能通过意外或恶意修改或覆盖该值。此外,它确实让您保持全球可用价值的便利。
答案 2 :(得分:0)
您还可以使用类常量和/或静态:
class myClass
{
const MY_API_KEY = 'somestringofstuff';
// Or use a static array if you need access to multiple keys
public static $apiKeys = array(
'dev' => 'mydevapikey',
'prod' => 'myprodapikey'
);
}
// Calling code
$apiKey = myClass::MY_API_KEY;
// Or
$apiKey = myClass::$apiKeys['dev'];