用户
 找回密码
 入住 CI 中国社区
搜索
12
返回列表 发新帖
楼主: ciuseronez
收起左侧

[讨论/交流] 关于 $CI = &get_instance() 求指教

[复制链接]
发表于 2015-9-10 11:47:42 | 显示全部楼层
CodeIgniter.php里面的
PHP复制代码
 
function &get_instance()
{
        return CI_Controller::get_instance();
}
 
复制代码


这个CI_Controller::get_instance(); 不需要加&么?
PHP复制代码
 
 return &CI_Controller::get_instance();
 
复制代码

这样


发表于 2015-9-10 16:36:57 | 显示全部楼层
Hex 发表于 2013-5-21 13:46
你说的都不错,但是你没有注意 get_instance 的使用场景,这个方法并不是用在控制器中的。
而是用在控制器 ...

确实应该是应该 return &CI_Controller::get_instance(); 这么写吧?

我写了下面的例子
PHP复制代码
<?php
error_reporting(E_ALL);
class A
{
        public $i = 0;
        static $instance;
        public static function &getInstance()
        {
                if (is_null(self::$instance)) {
                        self::$instance = new A();
                }
                return self::$instance;
        }
}
 
$aa = A::getInstance();
A::$instance = null;
var_dump($aa->i);       //正常,说明$aa是A的副本
 
$bb = &A::getInstance();
A::$instance = null;
var_dump($bb->i);       //报错 Notice: Trying to get property of non-object, 证明$bb是引用
 
 
复制代码



可见如果不加&的话,虽然在调用$CI = &get_instance();的时候是引用,但是在get_instance这个方法里面却返回的是CI实例的副本了,这应该和CI的本意是相违背的吧?
发表于 2016-1-4 16:29:20 | 显示全部楼层
当前类的实例的引用和引用类的实例是不一样的,$this是前者,(&$this)或者(&某一个实例)是后者

本版积分规则