1. 云栖社区>
  2. PHP教程>
  3. 正文

从php的动态实例化类联想

作者:用户 来源:互联网 时间:2017-12-01 19:41:47

php实例动态联想

从php的动态实例化类联想 - 摘要: 本文讲的是从php的动态实例化类联想, 今天在看TP的api文档时发现了M()这个奇特的函数,它的作用是实例化一个模型类 $User = M( 'User' ); 相当于$User = new Model('User'); 下面的代码就是普通从堆中实例化一个对象出来,而上面的我


今天在看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程序设计中,反射机制是很重要的一种技术,它在实现类的继承中发挥了很大的作用。
   现在的编程语言都差不多能包含反射的应用,但由于反射机制需要调用语言内部的匹配模式,所以运行速度会有一定的下降,所以反射的应用不能乱用在考虑效率的时候往往更需要注意~~

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 实例 , 动态 联想 ,以便于您获取更多的相关知识。