Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插件的设计方法_Php_Plugins - Fatal编程技术网

Php 插件的设计方法

Php 插件的设计方法,php,plugins,Php,Plugins,我为我的CMS设计了两种形式的插件,但其中一种有问题。第一个将在模板中实现,很酷,没有问题。但是第二个是我的管理区,我是这样设计的 首先,我定义了一个指令文件,它是一个包含以下内容的文本文件: REPLACE_INLINE("sample.php","//Echo/*","//Echo*/","echo \"test\"","echo \"new test\""); 在我的插件安装函数中,我分解了这些参数,然后去做它们,最后保存新内容。它工作得很好,但我想知道,这是设计插件的正确方法吗?我想不

我为我的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*/
  }
?>

一种更有条理的方式是去做。例如,构建一个抽象的
插件
基类,并在插件中扩展它

对于您的管理区域,您可以创建一个带有一些附加要求和/或添加基本功能的
AdminPlugin
。类似于
getText()
函数,它将返回文本(您的管理区域最终应该呈现文本)


您还可以在对象中包含依赖关系管理,以防止发生如您所述的崩溃。

一种更有条理的方法就是这样做。例如,构建一个抽象的
插件
基类,并在插件中扩展它

对于您的管理区域,您可以创建一个带有一些附加要求和/或添加基本功能的
AdminPlugin
。类似于
getText()
函数,它将返回文本(您的管理区域最终应该呈现文本)


您还可以在对象中包含依赖关系管理,以防止发生如您所述的崩溃。

不必以文本方式替换内容,您应该使用面向对象的体系结构,其中子类可以覆盖
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>';
};
$plugin_callbacks=array();
函数showText(){
$text='test';
foreach($plugin\u回调为$cb){
$text=调用用户函数($cb,$text);
}
echo$文本;
}
$plugin_callbacks[]=函数($text){
返回“新文本”;
}
$plugin_callbacks[]=函数($text){
返回“.$text.”;
};

然而,正如你所看到的,这很快就会变得一团糟。因此,除非回调的数量非常有限,否则使用面向对象的设计(这将要求您拥有一个实例化工厂,插件可以在其中注册并确定echoObject将是哪种类型)。

而不必通过文本替换内容,您应该使用面向对象的体系结构,其中子类可以覆盖
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>';
};
$plugin_callbacks=array();
函数showText(){
$text='test';
foreach($plugin\u回调为$cb){
$text=调用用户函数($cb,$text);
}
echo$文本;
}
$plugin_callbacks[]=函数($text){
返回“新文本”;
}
$plugin_callbacks[]=函数($text){
返回“.$text.”;
};

然而,正如你所看到的,这很快就会变得一团糟。因此,除非回调的数量非常有限,否则请使用面向对象的设计(这将要求您拥有一个实例化工厂,插件可以在其中注册并确定echoObject的类型).

这个问题很难用您提供的信息来回答,因为您的CMS的设计没有明确说明。我想说的是,你的插件设计并不是一个真正的设计,但我不能提出任何更好的建议。通常这是通过回调完成的,这样您就可以动态扩展现有代码。谢谢。它不像MVC或其他东西那样设计,它只是解决问题的一种方法。我对扩展有问题。如果有一个类通过函数genForm_post();,生成我的帖子表单;,因此,如果我想安装一个插件,在我的表单中添加一些东西,而不仅仅是在表单的第一个或底部,那么我应该怎么做呢?这个问题很难用您提供的信息来回答,因为您的CMS的设计是未指定的。我想说的是,你的插件设计并不是一个真正的设计,但我不能提出任何更好的建议。通常这是通过回调完成的,这样您就可以动态扩展现有代码。谢谢。它不像MVC或其他东西那样设计,它只是解决问题的一种方法。我对扩展有问题。如果有一个类通过函数genForm_post();,生成我的帖子表单;,因此,如果我想安装一个插件,在我的表单中添加一些东西,而不仅仅是在表单的第一个或底部,那么我应该怎么做呢?是的。我知道,正如我所说,我有两种形式的插件,第一种是公共的,常见的是基于挂钩的,比如Linux内核或WordPress。但在管理区域,您应该能够添加一些额外的数据或使用插件修改现有的数据。这是我的观点。我的例子只是一个例子,它不是我CMS中的真正来源。啊,够公平了。。对我来说并不明显,是的。我知道,正如我所说,我有两种形式的插件,第一种是公共的,常见的是基于挂钩的,比如Linux内核或WordPress。但在管理区域,您应该能够添加一些额外的数据或使用插件修改现有的数据。这是我的观点。我的例子只是一个例子,它不是我CMS中的真正来源。啊,够公平了。。对我来说并不明显,是的!我就是这么说的。如何修改和/或添加数据。谢谢但正如你所说,很快就会变得一团糟,但无论如何,如果你应该做点什么,那么你就应该做。是的!我就是这么说的。如何使用mo