有几行代码不是太懂,请高手帮忙分析

MrCeffoo 2012-01-28 09:00:47
这个代码摘自ThinkPHP框架里的某个小片段

    /**
+----------------------------------------------------------
* 取得对象实例 支持调用类的静态方法
+----------------------------------------------------------
* @param string $class 对象类名
* @param string $method 类的静态方法名
+----------------------------------------------------------
* @return object
+----------------------------------------------------------
*/
static public function instance($class,$method='') {
$identify = $class.$method;
if(!isset(self::$_instance[$identify])) { //这一行的self::不是太明白怎么回事
if(class_exists($class)){ //这个是判断如果类存在?
$o = new $class();
if(!empty($method) && method_exists($o,$method))
self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); //这一行怎么解释?
else
self::$_instance[$identify] = $o; //这一行怎么解释?
}
else
halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt从来没见过这东西……
}
return self::$_instance[$identify];
}


...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wide288 2012-01-29
  • 打赏
  • 举报
回复
这函数实现了两种功能:
1. 工厂类:用于创建对象。 如果方法为空,则返回类。
2. 执行某个类的方法。 方法不为空则返回方法执行的结果。
------------------------
读代码要从大局着眼。
解释的真不错。也跟着学习了。

从大入小。
策马江湖 2012-01-29
  • 打赏
  • 举报
回复
okayu已经解释的很好了
熊猫哥哥 2012-01-29
  • 打赏
  • 举报
回复
假设这个类的名称: Core.php
Core.php里面有一个静态属性
public static $_instance //注意这个属性是数组。


这函数实现了两种功能:
1. 工厂类:用于创建对象。 如果方法为空,则返回类。
2. 执行某个类的方法。 方法不为空则返回方法执行的结果。

if(!isset(self::$_instance[$identify])) { //静态方法的引用要用Self 。 Self:表示当前类本身,不是当前对象。

if(class_exists($class)){ //这个是判断这个类文件是否存在,当然这个是封装后的方法。你可以理解为IO操作中 File_exist(filename).

self::$_instance[$identify] = call_user_func_array(array(&$o, $method)); // 这个实际上是反射调用某个类的方法。

self::$_instance[$identify] = $o; // 如果方法名称为空,就把对象放入数组中。

halt(L('_CLASS_NOT_EXIST_').':'.$class); //halt 单词意思是停止。 好像是停止编译吧。
熊猫哥哥 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fxs_2008 的回复:]
这个类是一注册类! 不能说是工场类!有局限性

1) 如果是类没有初始化,则初始化,存在类属性数组中;如果类已初始化,则返回已初始化的类。(工场类应该每次均返回一个新实例;

2) 如果有方法,但返回调用方法的结果。(无法传参,调用的是任意方法,而不是所说的静态方法)

call_user_func_array(array(&$o, $method)) 这里的&不知有没……
[/Quote]

上面说得更准确。 工厂类的却是返回初始化的对象。
‘&’:不要也可以。
-----------------------------------------
我也在学习ThinkPhp的源代码。好多看不懂的。呵呵,偶是半路出家的,以前不是学PHP的。
qiji_2009 2012-01-29
  • 打赏
  • 举报
回复
&$o 在php中 貌似就是$o
和C的指针类似 但又有区别!
fxs_2008 2012-01-29
  • 打赏
  • 举报
回复
这个类是一注册类! 不能说是工场类!有局限性

1) 如果是类没有初始化,则初始化,存在类属性数组中;如果类已初始化,则返回已初始化的类。(工场类应该每次均返回一个新实例;

2) 如果有方法,但返回调用方法的结果。(无法传参,调用的是任意方法,而不是所说的静态方法)

call_user_func_array(array(&$o, $method)) 这里的&不知有没有必要。



K-dash 2012-01-29
  • 打赏
  • 举报
回复
我才快学到框架而已……帮顶
my828 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 okayu 的回复:]
假设这个类的名称: Core.php
Core.php里面有一个静态属性
public static $_instance //注意这个属性是数组。


这函数实现了两种功能:
1. 工厂类:用于创建对象。 如果方法为空,则返回类。
2. 执行某个类的方法。 方法不为空则返回方法执行的结果。

if(!isset(self::$_instance[$identify])) { ……
[/Quote]

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧