设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心]

哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心] -- 怎么了,没什么

查看: 593|回复: 3

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:204
  • 打卡月天数:0
  • 打卡总奖励:3128
  • 最近打卡:2023-08-27 04:29:19
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
386
主题
353
精华
0
金钱
4271
积分
759
注册时间
2022-12-22
最后登录
2025-2-18

发表于 2023-2-12 22:17:20 | 显示全部楼层 |阅读模式
本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下:
解释器模式,它是什么呢?
意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子,这是最实在的一种说法。
我们还可以理解为它是用于分析一个实体的关键元素,并且针对每个元素提供自己的解释或相应动作。解释器模式非常常用,比如PHP的模板引擎 就是非常常见的一种解释器模。
咱来看一个网上找的最简单的实例:
  1. <?php
  2. //解释器模式 用于分析一个实体的关键元素,并且针对每个元素提供自己的解释或相应动作
  3. //解释器模式非常常用,比如PHP的模板引擎 就是非常常见的一种解释器模式
  4. class template {

  5. private $left = '<!--{';
  6. private $right = '}-->';

  7. public function run($str) {
  8. return $this->init($str, $this->left, $this->right);
  9. }

  10. /**
  11. * 模板驱动-默认的驱动
  12. * @param string $str 模板文件数据
  13. * @return string
  14. */
  15. private function init($str, $left, $right) {
  16. $pattern = array('/'.$left.'/', '/'.$right.'/');
  17. $replacement = array('', '');
  18. return preg_replace($pattern, $replacement, $str);
  19. }
  20. }
  21. $str = "这是一个模板类,简单的模板类,标题为:<!--{Hello World}-->";
  22. $template = new template;
  23. echo $template->run($str);
复制代码
通过上述实例,大家对于解释器模式肯定有了自己的一个简单理解,我们接下来就看下这个解释器所包含的角色:
      
  •   环境角色:定义解释规则的全局信息。  
  •   抽象解释器::定义了部分解释具体实现,封装了一些由具体解释器实现的接口。  
  •   具体解释器(MusicNote):实现抽象解释器的接口,进行具体的解释执行。
完事,咱在网上看的,对于解释器(Interpreter)模式,还有另外一种说法,那就是它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。
树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。
但是,对于简单的语法,解释器添加一个规则就象添加一个类那样容易,但解释器没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。
解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。
同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。
来看下参与者:
◆客户端(Client):使用解释操作。
◆抽象表达式(AbstractExpression):基于一个表达式树抽象。
◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。
◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。
我们来看下《设计模式》一书针对这个模式提供的一个扩展示例,是一个网友使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中,如下:
  1. /**
  2. * AbstractExpression. All implementations of this interface
  3. * are ConcreteExpressions.
  4. */
  5. interface MathExpression
  6. {
  7. /**
  8.   * Calculates the value assumed by the expression.
  9.   * Note that $values is passed to all expression but it
  10.   * is used by Variable only. This is required to abstract
  11.   * away the tree structure.
  12.   */
  13. public function evaluate(array $values);
  14. }

  15. /**
  16. * A terminal expression which is a literal value.
  17. */
  18. class Literal implements MathExpression
  19. {
  20. private $_value;

  21. public function __construct($value)
  22. {
  23.   $this->_value = $value;
  24. }

  25. public function evaluate(array $values)
  26. {
  27.   return $this->_value;
  28. }
  29. }

  30. /**
  31. * A terminal expression which represents a variable.
  32. */
  33. class Variable implements MathExpression
  34. {
  35. private $_letter;

  36. public function __construct($letter)
  37. {
  38.   $this->_letter = $letter;
  39. }

  40. public function evaluate(array $values)
  41. {
  42.   return $values[$this->_letter];
  43. }
  44. }

  45. /**
  46. * Nonterminal expression.
  47. */
  48. class Sum implements MathExpression
  49. {
  50. private $_a;
  51. private $_b;

  52. public function __construct(MathExpression $a, MathExpression $b)
  53. {
  54.   $this->_a = $a;
  55.   $this->_b = $b;
  56. }

  57. public function evaluate(array $values)
  58. {
  59.   return $this->_a->evaluate($values) + $this->_b->evaluate($values);
  60. }
  61. }

  62. /**
  63. * Nonterminal expression.
  64. */
  65. class Product implements MathExpression
  66. {
  67. private $_a;
  68. private $_b;

  69. public function __construct(MathExpression $a, MathExpression $b)
  70. {
  71.   $this->_a = $a;
  72.   $this->_b = $b;
  73. }

  74. public function evaluate(array $values)
  75. {
  76.   return $this->_a->evaluate($values) * $this->_b->evaluate($values);
  77. }
  78. }

  79. // 10(a + 3)
  80. $expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3)));
  81. echo $expression->evaluate(array('a' => 4)), "\n";
  82. // adding new rules to the grammar is easy:
  83. // e.g. Power, Subtraction...
  84. // thanks to the Composite, manipulation is even simpler:
  85. // we could add substitute($letter, MathExpression $expr)
  86. // to the interface...
复制代码
咱最后再分享一个实例,如下:
  1. <?php
  2. header("Content-type:text/html;Charset=utf-8");

  3. //环境角色,定义要解释的全局内容
  4. class Expression{
  5. public $content;
  6. function getContent(){
  7.   return $this->content;
  8. }
  9. }

  10. //抽象解释器
  11. abstract class AbstractInterpreter{
  12. abstract function interpret($content);
  13. }

  14. //具体解释器,实现抽象解释器的抽象方法
  15. class ChineseInterpreter extends AbstractInterpreter{
  16. function interpret($content){
  17.   for($i=1;$i<count($content);$i++){
  18.    switch($content[$i]){
  19.    case '0': echo "没有人<br>";break;
  20.    case "1": echo "一个人<br>";break;
  21.    case "2": echo "二个人<br>";break;
  22.    case "3": echo "三个人<br>";break;
  23.    case "4": echo "四个人<br>";break;
  24.    case "5": echo "五个人<br>";break;
  25.    case "6": echo "六个人<br>";break;
  26.    case "7": echo "七个人<br>";break;
  27.    case "8": echo "八个人<br>";break;
  28.    case "9": echo "九个人<br>";break;
  29.    default:echo "其他";
  30.    }
  31.   }
  32. }
  33. }
  34. class EnglishInterpreter extends AbstractInterpreter{
  35. function interpret($content){
  36.   for($i=1;$i<count($content);$i++){
  37.     switch($content[$i]){
  38.     case '0': echo "This is nobody<br>";break;
  39.     case "1": echo "This is one people<br>";break;
  40.     case "2": echo "This is two people<br>";break;
  41.     case "3": echo "This is three people<br>";break;
  42.     case "4": echo "This is four people<br>";break;
  43.     case "5": echo "This is five people<br>";break;
  44.     case "6": echo "This is six people<br>";break;
  45.     case "7": echo "This is seven people<br>";break;
  46.     case "8": echo "This is eight people<br>";break;
  47.     case "9": echo "This is nine people<br>";break;
  48.     default:echo "others";
  49.    }
  50.   }
  51. }
  52. }

  53. //封装好的对具体解释器的调用类,非解释器模式必须的角色
  54. class Interpreter{
  55.   private $interpreter;
  56.   private $content;
  57.   function __construct($expression){
  58.   $this->content = $expression->getContent();
  59.   if($this->content[0] == "Chinese"){
  60.     $this->interpreter = new ChineseInterpreter();
  61.    }else{
  62.     $this->interpreter = new EnglishInterpreter();
  63.    }
  64.   }
  65.   function execute(){
  66.    $this->interpreter->interpret($this->content);
  67.   }
  68. }

  69. //测试
  70. $expression = new Expression();
  71. $expression->content = array("Chinese",3,2,4,4,5);
  72. $interpreter = new Interpreter($expression);
  73. $interpreter->execute();

  74. $expression = new Expression();
  75. $expression->content = array("English",1,2,3,0,0);
  76. $interpreter = new Interpreter($expression);
  77. $interpreter->execute();
  78. ?>
复制代码
结果:
  1. 三个人
  2. 二个人
  3. 四个人
  4. 四个人
  5. 五个人
  6. This is one people
  7. This is two people
  8. This is three people
  9. This is nobody
  10. This is nobody
复制代码
好啦,本次记录就到这里了。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2024-11-30 00:43:20 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2025-3-4 18:00:56 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:5
  • 最近打卡:2024-12-28 03:52:49
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
10
注册时间
2023-11-13
最后登录
2024-12-28

发表于 3 天前 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表