我为我的CMS设计了两种形式的插件,但我遇到其中一种形式的问题。第一个将在模板中实现,很酷,没有问题。但是第二个是我的管理区域,我是用这种方式设计的。
首先,我定义了一个指令文件,该文件是一个包含以下内容的文本文件:
REPLACE_INLINE("sample.php","//Echo/*","//Echo*/","echo \"test\"","echo \"new test\"");
在我的插件安装功能中,我将这些参数分开,然后我去做它们,最后我保存了新内容。它工作正常但我想知道,它是设计插件的正确方法吗?我认为不是,为此我发布了一个主题。
顺便说一下,我的sample.php文件,我认为它是我的CMS的源文件之一包含这些数据:
<?php
function showText(){
//Echo/*
echo "test";
//Echo*/
}
?>
还有一件事,如果我这样做,也许下次另一个插件想要与echo“test”交互一些数据;如果它不像主模板那么我们就会热潮!崩溃。
插件安装后的sample.php数据:
<?php
function showText(){
//Echo/*
echo "new test";
//Echo*/
}
?>
答案 0 :(得分:1)
您不应该以文本方式替换内容,而应该使用面向对象的体系结构,其中子类可以覆盖showText
(和/或调用旧实现)或使用回调,如下所示:
$plugin_callbacks = array();
function showText() {
$text = 'test';
foreach ($plugin_callbacks as $cb) {
$text = call_user_func($cb, $text);
}
echo $text;
}
$plugin_callbacks[] = function($text) {
return 'new text';
}
$plugin_callbacks[] = function ($text) {
return '<b>' . $text . '</b>';
};
然而,正如你所看到的,这很快就会变得混乱。因此,除非回调数量非常有限,否则使用面向对象的设计(这将要求您拥有一个实例化工厂,插件可以在其中注册并确定echoObject的类型)。 / p>
答案 1 :(得分:0)
更有条理的方式是Object Oriented。例如,构建一个抽象的Plugin
基类并在插件中扩展它。
对于您的管理区域,您可以创建一个AdminPlugin
,其中包含一些其他要求和/或添加的基本功能。就像getText()
函数一样,返回文本(你的管理区域最终应该呈现它)。
您还可以在对象中包含依赖关系管理,以防止您所描述的崩溃。