从php的动态实例化类联想

今天在看TP的api文档时发现了M()这个奇特的函数,它的作用是实例化一个模型类

$User = M( 'User' );

相当于

$User = new Model('User');

下面的代码就是普通从堆中实例化一个对象出来,而上面的我刚开始以为是工厂模式或是单例模式的应用,于是到core中找到了M()这个方法的源代码:


/**
+----------------------------------------------------------
* M函数用于实例化一个没有模型文件的Model
+----------------------------------------------------------
* @param string name Model名称
+----------------------------------------------------------
* @return Model
+----------------------------------------------------------
*/
function M($name='',$class='Model') {
static $_model = array();
if(!isset($_model[$name.'_'.$class]))
$_model[$name.'_'.$class] = new $class($name);
return $_model[$name.'_'.$class];
}

这段代码是的确和我想的一样是工厂模式和单例模式结合的函数,对于静态数组内已存在的单例有则工厂输出,没有则工厂创建。
这里有一句比较有意思的话: new $class($name) ,哈哈,原来是传入字符串直接实例化一个类,以前学习php的时候这个细节还真没注意到过,这个语句和java中的 Class.forName("User").newInstance()有异曲同工之妙,以前还真没了解过php的反射机制
这边其实js中有类似的实现这种传字符串就能实例化类的函数,就是eval()

eval('model[' + name + '_' + tclass + '] = new ' + tclass + '(' + name + ');');

而在JavaScript中有一个很方便的语法来实现反射:

for(var p in obj){
if(typeof(obj[p]=="function"){
obj[p]();
}else{
alert(obj[p]);
}
}

这段语句遍历obj对象的所有属性和方法,遇到属性则弹出它的值,遇到方法则立刻执行。在后面可以看到,在面向对象的JavaScript程序设计中,反射机制是很重要的一种技术,它在实现类的继承中发挥了很大的作用。
现在的编程语言都差不多能包含反射的应用,但由于反射机制需要调用语言内部的匹配模式,所以运行速度会有一定的下降,所以反射的应用不能乱用在考虑效率的时候往往更需要注意~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值