在PHP5.2中不用Runkit 给类动态添加新方法
js中的对象可以动态添加方法. 在PHP5.2中可用Runkit 给类添加方法. 而到php5.3,增加了闭包的语法. 可以直接动态添加方法.
由于Runkit 是在PECL中的,一般无法直接使用.所以,在在PHP5.2中,也就受到了限制. 所以,人们说PHP5.2仍不是动态结构语言.
而js中的对象可以动态添加方法,这对于精简代码,减少继承与扩展,对人总有吸引力.
是否真的不能动态添加呢.其实是可以的,只不能人们没有找到实现的方法.
现在我们就讲解一下,如何动态添加:
class ActiveStruct {
var $lambda=array(); //定义保存动态方法的数组
//定义动态添加方法的方法
function addFunction($name,$code) {
$func=create_function('',$code);
$this->lambda[$name] = $func;
}
//为动态添加的方法增加调用接口
function __call($name,$args){
if (array_key_exists($name,$this->lambda)){
$func = $this->lambda[$name];
return $func($args);
}
}
}
//创建对象
$objAcst = new ActiveStruct();
//添加新方法
$objAcst->addFunction('newFunc', '$vars = func_get_args(); return ($vars[0][0].$vars[0][1]);');
//对新方法进行测试
$testResult=$objAcst->newFunc('Hello,',' Php! ');
echo($testResult);
?>
需要注意的是, 使用这一方式,动态添加的方法,我们不能显式声明变量的个数.而在动态添加的方法内部.要获取传入的参数,只能通过:
$vars = func_get_args();
无论多少个变量,传入的参数均是在$vars[0]中
所以,要了解传入多少个参数,那就需要用 count($vars[0]);
对参数的使用则是:
$vars[0][0], $vars[0][1], 依次类推.
另外的不足,则是,因为是用create_function实现的,所以,代码要写成字串.
其次则是 __call函数使用,会影响效率.
尽管如此,却为你能够在虚拟主机的空间,使方法能动态添加成为可能! 所以, 需要时,还是可以用的.
当然,如果你有更好的改进办法, 也请你告诉我!