元语言编程,都是要用在最灵活的地方的。
最近的任务,设计一个极为灵活的试题计算项目,而这最大的困难就是,几套试卷的得分计算规则都不一样。
如果要按照一般的方法,可能就直接写六套程序完事,但这其中有大量相同的部分,如果设计不好,则会导致大量代码冗余,造成维护困难。
为此,要精心设计一个方法,利用元语言编程,将不同的逻辑写到配置文件中,形成一个统一的规则,就可以完成任务了。
闲话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