在PHP中替代全局

时间:2012-08-30 09:16:20

标签: php oop

除非绝对必要,否则全局变量通常被视为不良做法,所以我正在寻找其他方法来实现某些功能。

我们目前正在使用PHP的CMS系统,并希望允许其他开发人员轻松地为CMS编写模块。我们已经定义了一个CMS类,如下所示:

class CMS
{
    public $version;
    public $sitename;
    public $siteurl;
    public $tbl_prefix;

    function __construct()
    { 

    }

    function RegisterModule()
    {

    }
}

现在,我们希望生成CMS的实例,并通过变量$_cms使开发人员(以及所有模块和核心文件)可以访问它。由于我们无法在PHP中使用对象的常量变量,并且使用Singleton模式提供了访问实例的笨拙语法(即CMS::GetInstance()->RegisterModule()),有没有办法在不定义包含全局变量的情况下实现我们想要的CMS的实例?

理想情况下,我们正在寻找类似以下语法的内容:

_cms->RegisterModule();$_cms->RegisterModule();,前者是首选。

3 个答案:

答案 0 :(得分:4)

要求将插件编码为类,extend CMS类或接受它作为其构造函数的参数。这也称为依赖注入,它只是你可以获得的最干净的界面。

class MyPlugin {

    public function __construct(CMS $cms) {
        ...
    }

}

要求插件成为类也使得它非常干净,并且很容易从应用程序中包含它们,因为它们是自包含的,并且可以轻松地遵循特定的命名和接口约定。

答案 1 :(得分:0)

您可以使用静态类将方法调用重定向到GetInstance() - Methods。

是否需要拥有一个实例,或者是否可以将CMS类声明为静态?

http://www.php.net/manual/en/language.oop5.static.php

答案 2 :(得分:0)

我不知道我是不是在制作会议,但让我表达我的观点 如果我有这样的问题,我会使用魔术方法__call()将适用于其他开发人员将要处理的文件 它看起来像 在我的一个代码文件中

function __call($name,$params)
{
   if($name == 'RegisterModule')
   {
      $cms = myRegisty::get('cms');
      $cms->RegisterModule($params); 
   }

}

在模块注册时,它看起来像

RegisterModule($params);

希望它有所帮助:)我认为你的consern是关于语法的,并希望看起来更敏锐的代码,所以这是我的观点