PHP的元语言编程

元语言编程,都是要用在最灵活的地方的。

最近的任务,设计一个极为灵活的试题计算项目,而这最大的困难就是,几套试卷的得分计算规则都不一样。

如果要按照一般的方法,可能就直接写六套程序完事,但这其中有大量相同的部分,如果设计不好,则会导致大量代码冗余,造成维护困难。

为此,要精心设计一个方法,利用元语言编程,将不同的逻辑写到配置文件中,形成一个统一的规则,就可以完成任务了。

闲话eval函数

PHP是一门灵活的脚本语言,既然是脚本语言,那么一般都会提供相应的元编程方法,最古老的便是eval函数。

Eval函数最早在lisp中的实现,被人们广为接受,eval函数接受一个字符串作为参数(当然在lisp中是列表),然后将这段字符串中的值作为代码执行。

Eval函数实际上是调用了解析器内部函数,通过对文本进行词法分析,语法分析,处理当前符号表,然后进行执行。

<?php

$string = ‘Bierglas‘;
$name = ‘Binding-Lager‘;
$str = ‘Das ist mein $string, voll mit $name.‘;
echo $str . "\n";
eval ("\$str = \"$str\";");
echo $str . "\n";

这段php代码,就是eval函数的一个最好例子,当然,这里还用到了php中的一个重要特性,单引号引起来的,是纯的字符串,而双引号引起来的部分,则包含了大量的转义信息,例如:$开头的变量会被格式化进去,而\n也只有在双引号下才是换行,否则仅仅输出\n。

下面是执行结果:

$ php test.php
Das ist mein $string, voll mit $name.
Das ist mein Bierglas, voll mit Binding-Lager.

php函数的特殊调用

说完eval函数,其实php还有一些便利的内部函数可以使用。

call_user_func ,可以根据字符串中的名字调用一个php函数

call_user_func_array,传递的参数可以是一个数组,这样就避免了不定参数的传递问题。


<?php
/**
 * @Author: sxf
 * @Date:   2015-07-29 23:00:36
 * @Last Modified by:   sxf
 * @Last Modified time: 2015-07-29 23:36:16
 */

    function a($b, $c)
    {
        echo $b ."\n";
        echo $c ."\n";
    }

    call_user_func_array(‘a‘, array("111", "222")); 


本文属 西风逍遥游 原创, 转载请注明出处: 西风世界 http://blog.csdn.net/xfxyy_sxfancy

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 19:34:35

PHP的元语言编程的相关文章

无人编程让程序员失业

无人编程让程序员失业 开发无人编程即编程自动化系统,让程序员失业 不久前我写了汉澳sinox无人工厂,引起很大反响,东莞开始有工厂实施无人工厂计划,取代工人.虽然目前即使开发无人工厂也可能只是0.1版本,然后有1.0,2.0,无人工厂不断升级版本,当然跟预想中的汉澳sinox无人工厂还有很大距离,但是毕竟提出了概念,并指明了方向,无人工厂技术研究很可能在中国引发新的工业革命.也为中国制造业指明了出路,不用担心产业转移等让中国丧失世界工厂的地位,无人工厂技术和资金投入会越来越多,保持中国制造业领先

第17本:《代码的未来》

第17本:<代码的未来> 要去西南出差了,却从自己的书架上和Kindle中找不出感兴趣的书来,临出发前去老 SUN屋里寻摸一圈,选中了<代码的未来>这本书.选中它的原因有几条:Ruby之父写的书,作者是日本人,日本人写的书一般比较实用.也想了解一下 Ruby.翻目录时发现有Go.Dart.CoffeeScript.Lua几个新语言的对比分析.老SUN说网上对此书评价不错. 飞机上看了一路,一口气读了前2章,90多页,对各种语言中的关键特性分析得相当到位,对语言的发展历史有了概括性的

读书笔记2014第17本:《代码的未来》

要去西南出差了,却从自己的书架上和Kindle中找不出感兴趣的书来,临出发前去老SUN屋里寻摸一圈,选中了<代码的未来>这本书.选中它的原因有几条:Ruby之父写的书,作者是日本人,日本人写的书一般比较实用.也想了解一下Ruby.翻目录时发现有Go.Dart.CoffeeScript.Lua几个新语言的对比分析.老SUN说网上对此书评价不错. 飞机上看了一路,一口气读了前2章,90多页,对各种语言中的关键特性分析得相当到位,对语言的发展历史有了概括性的了解.出差后白天忙工作,晚上把剩下的部分快

atitit.元编程总结 o99

atitit.元编程总结 o99.doc 1. 元编程(Metaprogramming) 1 2. 元编程的历史and发展 1 3. 元类型and元数据 1 4. 元编程实现方式 2 4.1. 代码生成 2 4.2. lex和yacc分析器 2 4.3. 泛型编程 2 4.4. 注解 2 4.5. 解释型框架 2 4.6. 对象工厂概念,一个会写程序的程序! 3 4.7. Aop 3 4.8. 数据对象触发器和 可配置的插入式服务 3 5. 应用场景 4 6. 参考 4 1. 元编程(Meta 

杂谈编程

====编程解决方案====1.黑盒抽象2.约定接口3.元语言抽象约定接口主流的方法是面向对象和聚集操作 ====代码价值====1.我们写代码能够给客户带来商业价值么?2.成本与效益的考量,适当的时候不需要自己去写代码实现某种功能,购买就行3.形成竞争优势4.代码编写,必须熟悉BCL(基本的类库)5.拥抱开源代码 ====开发流程====一.测试驱动开发a.编写失败的测试代码b.编写通过测试的代码c.重构代码来优化结构d.重复上面的测试驱动 二.持续集成1.确保始终有一个最新代码的可测试的的软

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己