Home > Backend Development > PHP Tutorial > 有几行代码不是太懂,请高手帮忙分析,该怎么处理

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

WBOY
Release: 2016-06-12 16:19:53
Original
1011 people have browsed it

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

PHP code
<!--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];    }
Copy after login




------解决方案--------------------
假设这个类的名称: 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 单词意思是停止。 好像是停止编译吧。
------解决方案--------------------
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)) 这里的&不知有没……
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template