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

php5 中, 对象引用的注意问题_php

php 搞代码 7年前 (2018-06-19) 208次浏览 已收录 0个评论

php4年代, 对象的引用是通过一个简单的 “&” 符号来实现的.
php5中($obj1 = $obj2;)默认就是引用的方式, 不需要刻意的加一个 “&” 符号,但是在php5中仍然还保留了php4种

的这用引用方式.

但是这两种方式到底有什么区别呢,下面让我们来看看分析一下.

老的引用方式实现方式如下(下面的一段代码可以在php4和php5上跑):
代码1:
    class test{ function get(){return “aaaaa”;} }
    $t1 = new test();
    $t2 = &$t1;

http://www.gaodaima.com/46628.htmlphp5 中, 对象引用的注意问题_php

    echo $t1->get().”
“;
    echo $t2->get().”
“;
?>

这样变量 $t1 和 $t2 就指向了同一个对象, 他们共享内存中的同一个对象.

代码2:
    class test{ function get(){return “aaaaa”;} }
    $t1 = new test();
    $t2 = &$t1;
    unset($t1);
    echo ($t1===null)? “t1 is null.
“: “t1 is not null.
“;
    echo $t2->get().”
“;
?>

t1变量被unset后,t1变成了null, 但是t2仍然还是指向原来的对象.

代码3:
    class test{ function get(){return “aaaaa”;} }
    $t1 = new test();
    $t2 = &$t1;
    $t1 = null;
    echo ($t1===null)? “t1 is null.
“: “t1 is not null.
“;
    echo ($t1===null)? “t2 is null.
“: “t2 is not null.
“;
?>

t1=null后,t1变成了null, 可是t2竟然也变成了null

天啊,t1和t2的结果怎么会不一样呢? 折腾了半天才想明白, 通过”&” 引用的方式,实际上不应该叫做”引用”,应该叫做”传址”, 传址的概念在c语言里面是很明确的, 并且代码的书写方式是很类似的. 最开始,还以为这个和java里面对象引用的处理方式一样呢, 笨…………………啊!.

下面再来看看 php5 中的引用的方式吧.
代码4:
class test1{
    public function aa(){
        echo “aaaaaaaaaaa
“;
    }
    public function __destruct(){
        echo “game over!”;
    }
}
$t1 = new test1();
$t2 = $t1;
$t1 = null;
echo $t2->aa();
unset($t2);
?>

代码5:
class test1{
    public function aa(){
        echo “aaaaaaaaaaa
“;
    }
    public function __destruct(){
        echo “game over!”;
    }
}
$t1 = new test1();
$t2 = $t1;
unset($t1);
echo $t2->aa();
unset($t2);
?>

发现没有,代码4和代码5 的运行结果完全相同, 这个结果到是令人满意, 和java的对象引用的实现方式终于一致了.

————————————————–
结论, 结果证明php4的”&”这种方式是”传址”, 而php5的默认的方式是”引用”(唠叨批).
 
在 php5 中引用对象的时候要根据实际的情况选择适当的引用的方式. 如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 “&” 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 “&” 方式, 毕竟节省内存空间使用吗.

欢迎大家阅读《php5 中, 对象引用的注意问题_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


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

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

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

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

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