关于引用的一个小问题。。。散分。。

CodeBus 2010-07-28 03:03:47

$db = new db();
$db = &new db();

这两种$db有什么区别。。。。
...全文
194 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyaspnet 2010-08-12
  • 打赏
  • 举报
回复
学习。。。
CodeBus 2010-07-29
  • 打赏
  • 举报
回复
好像php5已经把实例化的class指针化了。所以&new就画蛇添足了。
CodeBus 2010-07-28
  • 打赏
  • 举报
回复
终于差不多明白了……

$t = new T();
$s = $t;
$n = &$t;//这里会导致Separation,$s会被存到新的zval 所以$t = null不会影响$s


php4中 class的实例在其他class或者function中 没有传递引用,php5修正了这一点。

refcount,is_ref,还有下面这段代码,&new和new好像还是有点区别,不过php5既然已经不建议&new,貌似也不用深究了。

class a {
public $a;
public function __construct($val) {
$this->a = $val;
}
}
$objs = array();
$obj = null;
for($i = 0; $i < 5;$i++) {
$obj = &new a($i); //下面输出01234
//$obj = new a($i); //下面输出44444
$objs[] = &$obj;
}
for($i = 0; $i < 5;$i++) {
echo $objs[$i]->a;
}


睡觉。。结贴。。
phpboy 2010-07-28
  • 打赏
  • 举报
回复

class a
{
public $a = 1;

function out()
{
$this->a ++;
}
}

function getVar($obj)
{
$obj->out();
}

$a = & new a();
$b = new a();

getVar($a);
getVar($b);


debug_zval_dump($a);
debug_zval_dump($b);


php下测试,二种效果一样,但在debug_zval_dump时,没有用&的refcount增加了,但函数调用的时候没有增加
phpboy 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 foolbirdflyfirst 的回复:]

其实phpboy说的也有些道理,具体如何实现,还得分析源码方知.

PHP code
class T{}
$t = new T();
$t2 = & new T();
$t3 = new T();
echo "<pre/>";
//refcount显示为2,其内部refcount应为1,因为debug_zval_dump会使变量有个引用过程。
debug_zval_d……
[/Quote]

是的
Dleno 2010-07-28
  • 打赏
  • 举报
回复
现在就是需要多点的对PHP底层原理的了解。
thanks老虎提供的地址。
的却可以学到很多。
CodeBus 2010-07-28
  • 打赏
  • 举报
回复
先谢谢大家....晚上回去消化下再结帖....
liuahuilele 2010-07-28
  • 打赏
  • 举报
回复
呵呵 没有深究过
学习下 增值知识
foolbirdflyfirst 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 amani11 的回复:]

TO:foolbirdflyfirst

那博客主不是你,还是你不承认,哈哈?那网址很早收藏了,应该也是通过你的回帖。

是或不是,认不认,都感谢吧
[/Quote]
肯定不是我啦,我有人家一半水平都不错了。
呵呵,我和你一样是跟着高手学习。
amani11 2010-07-28
  • 打赏
  • 举报
回复
TO:foolbirdflyfirst

那博客主不是你,还是你不承认,哈哈?那网址很早收藏了,应该也是通过你的回帖。

是或不是,认不认,都感谢吧
foolbirdflyfirst 2010-07-28
  • 打赏
  • 举报
回复
其实phpboy说的也有些道理,具体如何实现,还得分析源码方知.

class T{}
$t = new T();
$t2 = & new T();
$t3 = new T();
echo "<pre/>";
//refcount显示为2,其内部refcount应为1,因为debug_zval_dump会使变量有个引用过程。
debug_zval_dump($t);
debug_zval_dump($t2);//发现refcount比其它的同类少了一次。说明内部实现有些许不同,但是php5已经不推荐用&返回对象了。
debug_zval_dump($t3);

Dleno 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xuzuning 的回复:]

引用楼主 vn700 的回复:
$db = new db();
$db = &new db();

这两种$db有什么区别。。。。

$db = &new db();
画蛇添足!
new 算符永远都返回对象,无论是什么版本的php

所谓 PHP4里的对象默认不是通过引用传递的
是指,当你将一个对象传递给函数时,函数得到的是这个对象的副本。所以当你在函数里改……
[/Quote]


学习!!!!!
foolbirdflyfirst 2010-07-28
  • 打赏
  • 举报
回复
foolbirdflyfirst 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 vn700 的回复:]

引用 14 楼 foolbirdflyfirst 的回复:

PHP code
class T{}
$t = new T();
$s = $t;
$n = &amp;$t;
$t->str = '性别男,爱好女';
$t = null;//不该用unset
echo $n->str;//nothing...
echo $s->str;//php……
[/Quote]
unset只是将$t指向的zval结构体的refcount - 1,然后清除符号表里的't',去除$t与zval的关联
但是$s仍然是关联zval的。
我说不明白,有一篇高手写的文章专门讲这个的,在本坛我贴出来不少次了,你认真看看。
http://www.laruence.com/2008/08/22/412.html
xuzuning 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 vn700 的回复:]
$db = new db();
$db = &new db();

这两种$db有什么区别。。。。
[/Quote]
$db = &new db();
画蛇添足!
new 算符永远都返回对象,无论是什么版本的php

所谓 PHP4里的对象默认不是通过引用传递的
是指,当你将一个对象传递给函数时,函数得到的是这个对象的副本。所以当你在函数里改变对象的属性时,原来的对象仍保持原样

class A {
var $val = 1;
}

function foo($o) {
$o->val = 2;
echo $o->val;
}

$p = new A;
foo($p);
echo $p->val;


如果你在php4和php5中分别执行上述代码,则
php4 得到 21
php5 得到 22

CodeBus 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 phpboy005 的回复:]

OK 看完手册,有点了解了,说来分享,不对的话,大家再指证~~

使用和不使用& 主要是从使用类的性能和内存消耗的问题上考虑的

PHP code

class a
{
public $a = 1;

function __construct()
{
$this->a = 0;
}

function o……
[/Quote]
php5里好像不用& new a(); getVar函数里也不会产生对象copy了. 函数里操作会直接影响传入实参对象的值。。
CodeBus 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 foolbirdflyfirst 的回复:]

PHP code
class T{}
$t = new T();
$s = $t;
$n = &$t;
$t->str = '性别男,爱好女';
$t = null;//不该用unset
echo $n->str;//nothing...
echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
[/Quote]
确实unset不行厄。。
$t = null是改变引用的值?然后$s是$t=null赋值前拷贝出来的?
还是有点不明白额。php5 中 new T()不是已经是对象引用了么。 然后$s也应该是T对象的引用吧。为什么没有变成NULL呢。。
phpboy 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 foolbirdflyfirst 的回复:]

PHP code
class T{}
$t = new T();
$s = $t;
$n = &$t;
$t->str = '性别男,爱好女';
$t = null;//不该用unset
echo $n->str;//nothing...
echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
[/Quote]

说来说去,就是个引用的作用
不要用类来分析了,直接用变量来分析吧
foolbirdflyfirst 2010-07-28
  • 打赏
  • 举报
回复
class T{}
$t = new T();
$s = $t;
$n = &$t;
$t->str = '性别男,爱好女';
$t = null;//不该用unset
echo $n->str;//nothing...
echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
phpboy 2010-07-28
  • 打赏
  • 举报
回复
OK 看完手册,有点了解了,说来分享,不对的话,大家再指证~~

使用和不使用& 主要是从使用类的性能和内存消耗的问题上考虑的


class a
{
public $a = 1;

function __construct()
{
$this->a = 0;
}

function out()
{
$this->a ++;
}
}

function getVar($obj)
{
$obj->out();

return $obj->a;
}

$b = new a();
$a = & new a();

//函数调用时,函数内部会重新拷贝类a的实例
echo getVar($b);
//如果是引用的话,函数内部就不会重新拷贝类a的实例。
echo getVar($a);

加载更多回复(12)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧