PHP设计模式之解释器 Interpreter模式入门与应用详解

PHP设计模式之解释器(Interpreter)模式入门与应用详解

本文主要介绍了PHP设计模式的解释器模式,并结合实例详细分析了PHP解释器模式的概念、原理、基本应用及相关操作注意事项。有需要的可以参考一下。

本文用实例描述了PHP设计模式的解释器模式。分享给你,供你参考,如下:

解释器模式,是什么?

也就是说,给定一种语言,定义其语法的表示,并定义一个解释器,解释器使用该表示来解释该语言中的句子。这是最真实的说法。

我们也可以理解为是用来分析一个实体的关键元素,为每个元素提供自己的解释或者相应的动作。解释器模式很常见,比如PHP的模板引擎就是很常见的解释器模式。

让我们看看网上找到的最简单的例子:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

//解释器模式用于分析实体的关键元素,并为每个元素提供自己的解释或相应的动作。

//解释器模式很常见。比如PHP的模板引擎就是很常见的解释器模式。

类别模板{

private $left=!- {;

private $ right= }-;

公共函数运行($str) {

返回$this-init($str,$this-left,$ this-right);

}

/**

*模板驱动程序-默认驱动程序

* @ param stringstr模板文件数据

* @返回字符串

*/

私有函数init($str,$left,$right) {

$pattern=array(/)。$左。/, /.$对。/);

$replacement=array( , );

return preg_replace($pattern,$replacement,$ str);

}

}

$str=这是一个模板类,一个简单的模板类,标题为:-{ Hello World }-;

$template=新模板;

echo $ template-run($ str);

通过上面的例子,大家一定对解释器模式有了自己简单的认识。让我们来看看这个解释器中包含的角色:

角色:定义解释规则的全局信息。

抽象解释器:定义了部分解释的具体实现,封装了具体解释器实现的一些接口。

MusicNote:实现抽象解释器的接口,并执行具体的解释。

之后在网上看的。关于解释器模式还有另外一种说法,即它包含了一个复合类层次结构的语法表示。规则被映射到类,遵循语法的表达式可以被转换成抽象的语法树。除了复合模式的实例对象图,没有别的了。

树是一个抽象名词,因为其实很多时候是一个表达式的抽象表达。它忽略了可能有一个字符串或者一个数据结构的具体表达式(比如在PHP中,“a”和“x41”是同一抽象字值的不同具体表达式),通过逻辑规则解耦结果,解释过程大大简化。

但是对于简单的语法,解释器添加一个规则就像添加一个类一样容易,但是解释器并不解决具体表示到抽象语法树的转换,这是其他服务完成的。

解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

类似地,当包含一个解释器时,复合模式的叶和容器参与者名称将会不同,这些名称反映了它们所扮演的角色:终结或非终结表达式。

看一下参与者:

客户端:使用解释操作。

AbstractExpression:基于表达式树的抽象。

非终止符表达式:递归包含其他abstract expression(抽象表达式实例)的表达式。

TerminalExpression:不能进一步简化的表达式。

让我们看一下《设计模式》这本书为这种模式提供的一个扩展示例。一位网友通过用数学表达式替换布尔表达式对其进行了重新设计,所以这个例子解决了一个数学表达式的表示,它的evaluate()被分离在一个不同的ConcreteExpression类中,如下:

/**

*抽象表达式。此接口的所有实现

*是具体的表达。

*/

界面数学表达式

{

/**

*计算表达式假定的值。

*注意美元值被传递给除它之外的所有表达式

*仅由变量使用。这是抽象所要求的

*拉开树形结构。

*/

公共函数evaluate(数组$值);

}

/**

*一个终端表达式,它是一个文字值。

*/

类文本实现数学表达式

{

私有$ _值

公共函数_ _构造($值)

{

$ this-_ value=$ value;

}

公共函数评估(数组$值)

{

返回$ this-_ value;

}

}

/**

*代表变量的终结表达式。

*/

类变量实现数学表达式

{

私人$ _字母

公共函数_ _构造(字母)

{

$ this-_ letter=$ letter;

}

公共函数评估(数组$值)

{

返回$ values[$ this-_ letter];

}

}

/**

*非终结表达式。

*/

类总和实现数学表达式

{

私人$ _ a;

私人$ _ b;

公共函数_ _构造(数学表达式$a,数学表达式b美元)

{

$ this-_ a=$ a;

$ this-_ b=$ b;

}

公共函数评估(数组$值)

{

返回$ this-_ a-evaluate($ values)$ this-_ b-evaluate($ values);

}

}

/**

*非终结表达式。

*/

类产品实现数学表达式

{

私人$ _ a;

私人$ _ b;

公共函数_ _构造(数学表达式$a,数学表达式b美元)

{

$ this-_ a=$ a;

$ this-_ b=$ b;

}

公共函数评估(数组$值)

{

返回$ this-_ a-evaluate($ values)* $ this-_ b-evaluate($ values);

}

}

//10(a 3)

$ expression=new Product(new Literal(10),new Sum(new Variable(a ),new Literal(3)));

echo $ expression-evaluate(array( a =4)), n ;

//向语法中添加新规则很容易:

//例如乘方、减法.

//由于复合,操作更加简单:

//我们可以添加替代项($letter,MathExpression $expr)

//到接口.

咱最后再分享一个实例,如下:

?服务器端编程语言(专业超文本预处理器的缩写)

header( Content-type:text/html;charset=utf-8 );

//环境角色,定义要解释的全局内容

类别表达式{

公共$内容

函数getContent(){

返回$ this-内容;

}

}

//抽象解释器

抽象类抽象解释器{

抽象函数解释器($ content);

}

//具体解释器,实现抽象解释器的抽象方法

类中文翻译扩展抽象解释器{

函数解释器($content){

for($ I=1;$ icount($ content);$i ){

开关($content[$i]){

大小写"0":回显没有人br ;打破;

案例"1":回显一个人br ;打破;

案例"2":回声二个人br ;打破;

案例"3":回声三个人br ;打破;

案例"4":回声四个人br ;打破;

案例"5":回声五个人br ;打破;

案例"6":回声六个人br ;打破;

案例"7":回声七个人br ;打破;

案例"8":回声八个人br ;打破;

案例"9":回声九个人br ;打破;

默认:回显其他;

}

}

}

}

英语口译班扩展抽象解释器{

函数解释器($content){

for($ I=1;$ icount($ content);$i ){

开关($content[$i]){

大小写“0”:回声这是nobodybr ";打破;

事例【1】:回声这是一个人br ";打破;

案例【2】:回声这是两个人br ";打破;

案例【3】:回声这是三个人br ";打破;

案例【4】:回声这是四个人br ";打破;

案例【5】:回声这是五个人br ";打破;

案例【6】:回声这是六个人br ";打破;

案例“7”:回声这是七个人br ;打破;

案例【8】:回声这是八个人br ";打破;

案例【9】:回声这是九个人br ";打破;

默认:回显"其他";

}

}

}

}

//封装好的对具体解释器的调用类,非解释器模式必须的角色

类解释器{

私有$解释器;

私有$内容;

function _ _ construct($ expression){

$ this-content=$ expression-get content();

if($this-content[0]=中文){

$ this-interpreter=新中文解释器();

}否则{

$ this-interpreter=新英语解释器();

}

}

函数执行(){

$ this-interpreter-interpret($ this-content);

}

}

//测试

$ Expression=new Expression();

$expression-content=array(中文,3,2,4,4,5);

$解释器=新解释器($表达式);

$ interpreter-execute();

$ Expression=new Expression();

$ expression-content=array( English ,1,2,3,0,0);

$解释器=新解释器($表达式);

$ interpreter-execute();

结果:

三个人

二个人

四个人

四个人

五个人

这是一个民族

这是两个人

这是三个人

这是无名小卒

这是无名小卒

好啦,本次记录就到这里了。

更多关于服务器端编程语言(专业超文本预处理器的缩写)相关内容感兴趣的读者可查看本站专题: 《php面向对象程序设计入门教程》 、 《PHP数组(Array)操作技巧大全》 、 《PHP基本语法入门教程》 、 《PHP运算与运算符用法总结》 、 《php字符串(string)用法总结》 、 《php+mysql数据库操作入门教程》 及《php常见数据库操作技巧汇总》

希望本文所述对大家服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。

PHP设计模式之解释器 Interpreter模式入门与应用详解