• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

有几行代码不是太懂,请高手帮忙分析,该怎么处理

php 搞代码 4年前 (2022-01-25) 18次浏览 已收录 0个评论

有几行代码不是太懂,请高手帮忙分析
这个代码摘自ThinkPHP框架里的某个小片段

PHP code

<!---ecms Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->    /**     +----------------------     * 取得对象实例 支持调用类的静态方法     +----------------------     * @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];    }

——解决方案——————–
假设这个类的名称: 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_’).’:@本文9来源gao($daima.com搞@代@#码8网^搞代gaodaima码‘.$class); //halt 单词意思是停止。 好像是停止编译吧。
——解决方案——————–
okayu已经解释的很好了
——解决方案——————–
这函数实现了两种功能:
1. 工厂类:用于创建对象。 如果方法为空,则返回类。
2. 执行某个类的方法。 方法不为空则返回方法执行的结果。
————————
读代码要从大局着眼。
解释的真不错。也跟着学习了。

从大入小。
——解决方案——————–
这个类是一注册类! 不能说是工场类!有局限性

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

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

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

——解决方案——————–
&$o 在php中 貌似就是$o
和C的指针类似 但又有区别!
——解决方案——————–

探讨

这个类是一注册类! 不能说是工场类!有局限性

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

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:有几行代码不是太懂,请高手帮忙分析,该怎么处理

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址