PHP对元编程的支持

只要将一门编程语言与哲学结合起来就特别令人兴奋。因为能通过哲学思想去解释已有的经验,用big高点的话说就是’悟’。试想当一直无法理解的事情突然能通过某种方法论来解释,是多么相见恨晚的事情。

一。元编程

用来生成代码的程序有时被称为 元程序(metaprogram);编写这种程序就称为 元编程(metaprogramming)。编写这种输出代码的程序可以有无数的应用。简单的讲就是用代码来写代码。这里有两个问题,元编程中有什么哲学思想方法论来指导编程?我们编码的时候有用到这种思考方式吗?

当’程序员’刚成为一种职业的时候,编程用的还是汇编语言……那个时候写代码真的是太痛苦(虽然比用二进制编程进步了一些),直到高级编程语言的出现程序员才真正变成了一份很有前途的职业,比如C语言的出现。其实C语言就是用到了元编程的思想,通过编译器将字符串和语法生成汇编语言。今天高级语言的发展都离不开元编程的这种思想,把复杂的工作简单化。

再说一个编程中常用的例子,关于数据库的调用。数据库最原始的调用方法时直接写’SQL语句’然后通过数据库的端口调用。可是SQL语句写起来很不方便,比如一个字符写错都可能酿成大错,某些数据库的语法又有差异,于是人们通过Active Record来用程序生成SQL。开发效率成倍提升又安全。

前面提到的都是通过程序编写其他程序语言,比如用Python写程序生成C语言。如果我们要Python在执行的时候自动生成程序自动执行呢?想想都觉得很难……还记得很多年以前,老师在课堂上讲Java的反射机制,当时完全听不懂也不愿意听,今天才知道原来这个技术就是元编程的一种实现。

PHP对元编程实现的就相当好,下面举例说明:

1.把字符串当代码运行

eval()函数就是专门来做这事的,不过这个函数权力大,控制不好就相当危险。所以一般会被禁用,平时开发的时候也很少有,不建议使用。

function aa()
{
echo 123;
}
$t = “aa();echo 456;”;
eval($t); //结果输出 123456

2.通过字符串运行函数

通过字符串运行某个函数,方法很多,我把我知道的都说一下。
a.通过变量调用函数,只要是字符串变量都可以,$_POST[‘test’]这种全局变量也一样适用。

$ct = new Ctest();

$tt = “index”; //index()是Ctest类的方法

$ct->$tt();

b.通过函数调用,比较传统的方法。

3.通过字符串获取变量

a.看看美元符如何工作的!

$put = “Ha!ha!”;

$t = “put”;

echo $$t;

这样对美元符号有更深的理解了,就是用来取变量的。

b.静态变量通过constant()函数获取逼格更高,a的方式总觉得是耍小聪明!

const TPP = “123”;

define(“YRR”,”456”);

echo constant(“TPP”);

echo constant(“YRR”);

4.动态实例化类,就是我们说的反射。

$class = new ReflectionClass(‘Ctest’);//建立 Ctest这个类的反射类
$instance = $class->newInstanceArgs();//相当于实例化Ctest 类
$instance->demo();

如果反射只是为了动态的代替new实例化类的话,肯定不会有这么大的名气了。他的精髓在于可以获取类的所有信息,包括类中被保护的方法,甚至注释信息都可以获取到。获取这些信息后再配合元编程的自动执行方法,简直可以逆天!比如自动添加扩展,自动分析代码,自动生成文档。