1

除非绝对必要,否则全局变量通常被认为是不好的做法,因此我正在寻找实现某些功能的替代方法。

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

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

    function __construct()
    { 

    }

    function RegisterModule()
    {

    }
}

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

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

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

4

3 回答 3

4

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

class MyPlugin {

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

}

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

于 2012-08-30T09:20:49.320 回答
0

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

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

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

于 2012-08-30T09:19:55.923 回答
0

我不知道我是否在进行降神会,尽管让我提出我的看法代码文件

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

}

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

RegisterModule($params);

希望它有所帮助:)我认为你的关注是关于语法并且想要更敏锐的代码所以这就是我的观点

于 2012-08-30T09:29:19.143 回答