类的选项值的最佳实践位置

时间:2011-11-14 03:54:42

标签: php model-view-controller oop global-variables

使用PHP MVC项目,我有一些模型类可以从RESTful Web服务加载数据,这需要一个API密钥。我想将必要的API密钥存储在我的应用程序的中央配置文件中。

要将API密钥提供给我的班级,哪种方法最佳?

  1. 将值放在$GLOBALS中,以便可以在使用它的模型类中直接访问它。
  2. 在实例化时将值传递给类。
  3. 方法#2似乎最适合OOP和代码重用,但方法#1非常方便。我通常使用方法#2,但我想知道方法#1是否通常被认为是$GLOBALS的可接受用途,即使在OOP MVC环境中也是如此。

3 个答案:

答案 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'];