除非绝对必要,否则全局变量通常被视为不良做法,所以我正在寻找其他方法来实现某些功能。
我们目前正在使用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();
,前者是首选。
答案 0 :(得分:4)
要求将插件编码为类,extend
CMS
类或接受它作为其构造函数的参数。这也称为依赖注入,它只是你可以获得的最干净的界面。
class MyPlugin {
public function __construct(CMS $cms) {
...
}
}
要求插件成为类也使得它非常干净,并且很容易从应用程序中包含它们,因为它们是自包含的,并且可以轻松地遵循特定的命名和接口约定。
答案 1 :(得分:0)
您可以使用静态类将方法调用重定向到GetInstance() - Methods。
是否需要拥有一个实例,或者是否可以将CMS类声明为静态?
答案 2 :(得分:0)
我不知道我是不是在制作会议,但让我表达我的观点 如果我有这样的问题,我会使用魔术方法__call()将适用于其他开发人员将要处理的文件 它看起来像 在我的一个代码文件中
function __call($name,$params)
{
if($name == 'RegisterModule')
{
$cms = myRegisty::get('cms');
$cms->RegisterModule($params);
}
}
在模块注册时,它看起来像
RegisterModule($params);
希望它有所帮助:)我认为你的consern是关于语法的,并希望看起来更敏锐的代码,所以这是我的观点