免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2731 | 回复: 6
打印 上一主题 下一主题

PHP5中类的方法的引用疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-18 17:13 |只看该作者 |倒序浏览
class Test {

    private static $instance;

    public function __construct()
    {
        self::$instance =& $this;
    }

    public static function &getInstance()
    {
        return self::$instance;
    }
}

$ss=Test::getInstance();



如果把其中的“self::$instance =& $this”换成“self::$instance = $this”以及将“&getInstance()”换成“getInstance()”似乎是没什么影响的。
不知道是本来就没区别还是有啥区别,而上面这个例子看不出来呢。
个人认为是没区别的。

论坛徽章:
0
2 [报告]
发表于 2008-10-18 20:50 |只看该作者
本质上是有区别的。引用指导是原来的地址处。修改任何一个引用的值都会改。这里用引用是必须的。加入这个类还有一个属性 如果改变着个属性值,那 $instance 属性指的自己的那个属性却没有变却没有变。
class Test {

    private static $instance;
    private $i   //加入这里还有一个属性 i

    public function __construct()
    {
        self::$instance =& $this;    //如果这里不是引用 通过getInstance得到的i的值是不一样的。
        $this->i = 10;
    }

    public static function &getInstance()
    {
        return self::$instance;
    }
}

$ss=Test::getInstance();


[ 本帖最后由 shitou254 于 2008-10-18 20:55 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-10-18 21:39 |只看该作者
这个类里getInstance前面加&是php4遗留下来的习惯,php5不用的

论坛徽章:
0
4 [报告]
发表于 2008-10-19 01:57 |只看该作者
原帖由 shitou254 于 2008-10-18 20:50 发表
本质上是有区别的。引用指导是原来的地址处。修改任何一个引用的值都会改。这里用引用是必须的。加入这个类还有一个属性 如果改变着个属性值,那 $instance 属性指的自己的那个属性却没有变却没有变。
class T ...

我不是很明白你的意思。能具体说说吗?

论坛徽章:
0
5 [报告]
发表于 2008-10-20 04:06 |只看该作者
class Test {

    private static $instance;
    private $i   //加入这里还有一个属性 i

    public function __construct()
    {
        self::$instance =& $this;    //如果这里不是引用 通过getInstance得到的i的值是不一样的。
        $this->i = 10;
    }

    public static function &getInstance()
    {
        return self::$instance;
    }
}

$ss=Test::getInstance();


我发现$ss还是没什么变化啊?有不理解在__construct()里的那个&$this呢。

论坛徽章:
0
6 [报告]
发表于 2008-10-20 09:29 |只看该作者

回复 #1 J.k 的帖子

仔细看了那段代码,似乎有问题。return self:instance; 返回的是一个类的实例,这个实例应该是self:instance =& $this;完成的,但是如果这个直接调用静态方法。那self:instance =& $this; 这句根本没有执行,那return self:instance; 怎么会返回正确的实例呢。
我改成
    public static function &getInstance()
    {
            if(!isset(self:instance)) {
            $c = __CLASS__;
           self:instance = $this;
        }
        return self:instance;
                //self::instance = new Test;
                //print_r($this->instance);
        //return self::instance;
    }
才通过?

论坛徽章:
0
7 [报告]
发表于 2008-10-20 17:32 |只看该作者
原帖由 shitou254 于 2008-10-20 09:29 发表
仔细看了那段代码,似乎有问题。return self:instance; 返回的是一个类的实例,这个实例应该是self:instance =& $this;完成的,但是如果这个直接调用静态方法。那self:instance =& $this; 这句根本没有执 ...

我认为这段代码只是实现实例化吧。
通过new Test()和Test::getInstance()这两种方法来实现。
只是我觉得好奇的是通过new Test()的构造函数的时候,有个&和没&的区别是什么?
我只是没看出来2种方式的区别是什么?
我估计2种方式是没却别的,只是不同的& $this是PHP4时候的用法,而在php5里可以直接用self::instace=$this这样的方式了。

而你在回复的时候说的有没有&的区别在于:通过getInstance得到的i的值是不一样的。我就很不懂了。
现在我只是想明白,这个代码片段的作用是否只是为了实现实例化,在php5里有没有&是没有影响的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP