将静态变量用于全局配置参数的缺点

时间:2013-03-14 10:48:48

标签: php symfony

我知道还有其他方法可以存档,但问题是...... 哪些是类似的缺点:

MyGlobalConfig.php

<?php

namespace Acme\DemoBundle;

class MyGlobalConfig
{
    public static $uploadsDir;
}

AppKernel.php

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
use Acme\DemoBundle\MyGlobalConfig;

class AppKernel extends Kernel
{
    public function __construct($environment, $debug)
    {

        MyGlobalConfig::$uploadsDir = __DIR__ .'/../uploads';

        parent::__construct($environment, $debug);
    }

Article.php

<?php

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Acme\DemoBundle\MyGlobalConfig;

/**
 * @ORM\Entity
 */
class Article
{
    protected function getUploadsDir()
    {
        return MyGlobalConfig::$uploadsDir;
    }

1 个答案:

答案 0 :(得分:4)

  1. 不可测试的代码,因为要测试任何使用类需要为它们提供带有值的MyGlobalConfig,但很快您会注意到,如果ClassA收到的配置值不同于ClassB,那将非常有用,所以你开始为那些创造解决方案。或者classA用测试值污染全局状态,而ClassB需要原始值。等等。你继续在圈子里跑来跑去。

  2. 不可靠的代码,您的所有配置使用者都依赖于相同的,可能是单片的类。你不能拿出一个配置消费者而不用单片类。

  3. 全球状态,即可以从任何地方修改,因此完全无法预测和脆弱。

  4. 不太清晰的代码

  5. 可能我忘记了一些...... 它基本上是伪装的全球变种。 只有常量在全局范围内是可以的,因为它们是不可变的,但即便如此,许多开发人员也会使用太多的常量来处理他们不应该使用的东西。