这个代码摘自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];
    }

解决方案 »

  1.   

    假设这个类的名称:  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 单词意思是停止。 好像是停止编译吧。
      

  2.   

    这个类是一注册类! 不能说是工场类!有局限性1) 如果是类没有初始化,则初始化,存在类属性数组中;如果类已初始化,则返回已初始化的类。(工场类应该每次均返回一个新实例;2) 如果有方法,但返回调用方法的结果。(无法传参,调用的是任意方法,而不是所说的静态方法)call_user_func_array(array(&$o, $method)) 这里的&不知有没有必要。
      

  3.   

    &$o  在php中 貌似就是$o
    和C的指针类似 但又有区别!
      

  4.   


    上面说得更准确。 工厂类的却是返回初始化的对象。
    ‘&’:不要也可以。 
    -----------------------------------------
    我也在学习ThinkPhp的源代码。好多看不懂的。呵呵,偶是半路出家的,以前不是学PHP的。