元语言编程,都是要用在最灵活的地方的。
最近的任务,设计一个极为灵活的试题计算项目,而这最大的困难就是,几套试卷的得分计算规则都不一样。
如果要按照一般的方法,可能就直接写六套程序完事,但这其中有大量相同的部分,如果设计不好,则会导致大量代码冗余,造成维护困难。
为此,要精心设计一个方法,利用元语言编程,将不同的逻辑写到配置文件中,形成一个统一的规则,就可以完成任务了。
闲话eval函数
PHP是一门灵活的脚本语言,既然是脚本语言,那么一般都会提供相应的元编程方法,最古老的便是eval函数。
Eval函数最早在lisp中的实现,被人们广为接受,eval函数接受一个字符串作为参数(当然在lisp中是列表),然后将这段字符串中的值作为代码执行。
Eval函数实际上是调用了解析器内部函数,通过对文本进行词法分析,语法分析,处理当前符号表,然后进行执行。
<code><span><?php </span><span>$string</span> = <span>'Bierglas'</span>; <span>$name</span> = <span>'Binding-Lager'</span>; <span>$str</span> = <span>'Das ist mein $string, voll mit $name.'</span>; <span>echo</span><span>$str</span> . <span>"\n"</span>; <span>eval</span> (<span>"\$str = \"$str\";"</span>); <span>echo</span><span>$str</span> . <span>"\n"</span>;</span></code>
这段php代码,就是eval函数的一个最好例子,当然,这里还用到了php中的一个重要特性,单引号引起来的,是纯的字符串,而双引号引起来的部分,则包含了大量的转义信息,例如:$开头的变量会被格式化进去,而\n也只有在双引号下才是换行,否则仅仅输出\n。
下面是执行结果:
<code><span>$ </span>php test.php <span>Das</span> ist mein <span>$string</span>, voll mit <span>$name</span>. <span>Das</span> ist mein <span>Bierglas</span>, voll mit <span>Binding</span>-<span>Lager</span>.</code>
php函数的特殊调用
说完eval函数,其实php还有一些便利的内部函数可以使用。
call_user_func
,可以根据字符串中的名字调用一个php函数 call_user_func_array
,传递的参数可以是一个数组,这样就避免了不定参数的传递问题。
<code><span><?php </span><span>/** *<span> @Author</span>: sxf *<span> @Date</span>: 2015-07-29 23:00:36 *<span> @Last</span> Modified by: sxf *<span> @Last</span> Modified time: 2015-07-29 23:36:16 */</span><span><span>function</span><span>a</span><span>(<span>$b</span>, <span>$c</span>)</span> {</span><span>echo</span><span>$b</span> .<span>"\n"</span>; <span>echo</span><span>$c</span> .<span>"\n"</span>; } call_user_func_array(<span>'a'</span>, <span>array</span>(<span>"111"</span>, <span>"222"</span>)); </span></code>
本文属 西风逍遥游 原创, 转载请注明出处: 西风世界 http://blog.csdn.net/xfxyy_sxfancy
版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了PHP的元语言编程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。