关于引用的一个小问题。。。散分。。 $db = new db();$db = &new db();这两种$db有什么区别。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 PHP4里的对象默认不是通过引用传递的。加上&是为了让它按引用传递而不是按值传递。但是,在PHP5里,默认已经是按引用传递了,所以当你在PHP5里不建议使用&了。 $db = new db();$db 就是实例化对像,每次使用$db,都是在使用已经实例化的对像$db = &new db();$db 是实例化对像的引用,每次使用$db,都是重新实例化db类 抱着负责任的态度说一下刚才我说的不对 :(class a{ public $a = 1; function __construct() { $this->a = 0; } function out() { $this->a ++; echo $this->a; }}$a = &new a();$a->out();$a->out(); 首先接个分$db = new db();此时$db是一个对象,那么一个变量前面加个'&'是引用(指向变量的内存地址),那么对象也是一样的,一样是将$db指向了类db的实例$db的内存地址 class T{}$t = new T();$s = $t;$t->str = '性别男,爱好女';echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献 候鸟是对的..php4的OOP和php5区别好大.. 这个也不算是区别大,算是以前的PHP的BUG吧。在PHP4里。$obj = new obj();//$obj则并不是一个obj对象$obj = &new obj();//$obj才是个对象。这就是按引用传递和按值传递的区别所以到现在还有很多人还习惯用$obj = &new obj();这种方式来建立对象。但在php5里就无所谓了 class test{ function test(){ return 1; }}$test = new test();var_dump($test);$test = &new test();var_dump($test); 两种写法没区别,不用加&了。这个例子是因为变量与变量之间引用同一个zval,refcount为2,未分离改成下面就会有一个分离过程。class T{}$t = new T();$s = $t;$n = &$t;$t->str = '性别男,爱好女';unset($t);echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献 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); class T{}$t = new T();$s = $t;$n = &$t;$t->str = '性别男,爱好女';$t = null;//不该用unsetecho $n->str;//nothing...echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献 确实unset不行厄。。$t = null是改变引用的值?然后$s是$t=null赋值前拷贝出来的?还是有点不明白额。php5 中 new T()不是已经是对象引用了么。 然后$s也应该是T对象的引用吧。为什么没有变成NULL呢。。 php5里好像不用& new a(); getVar函数里也不会产生对象copy了. 函数里操作会直接影响传入实参对象的值。。 $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 得到 21php5 得到 22 unset只是将$t指向的zval结构体的refcount - 1,然后清除符号表里的't',去除$t与zval的关联但是$s仍然是关联zval的。我说不明白,有一篇高手写的文章专门讲这个的,在本坛我贴出来不少次了,你认真看看。http://www.laruence.com/2008/08/22/412.html 关键是这篇http://www.laruence.com/2008/09/19/520.html然后再结合php的GC原理会更深入一些。http://www.php.net/manual/en/features.gc.refcounting-basics.php 其实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); TO:foolbirdflyfirst那博客主不是你,还是你不承认,哈哈?那网址很早收藏了,应该也是通过你的回帖。是或不是,认不认,都感谢吧 现在就是需要多点的对PHP底层原理的了解。thanks老虎提供的地址。的却可以学到很多。 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增加了,但函数调用的时候没有增加 终于差不多明白了……$t = new T();$s = $t;$n = &$t;//这里会导致Separation,$s会被存到新的zval 所以$t = null不会影响$sphp4中 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;}睡觉。。结贴。。 好像php5已经把实例化的class指针化了。所以&new就画蛇添足了。 外包一php+mysql小网站程序部分价格:600元 php基础问题 谁能解释下为什么会发生这种情况…… Apache 正则表达式 php如何显示数据库中的变量? 注册页面,提交后phpmyadmin中文显示乱码 如何解决gzip编码问题 为何包含文件里的图片不能显示 关于管理员查看回复评论的问题 接口问题 我想问一下,有没有办法可以查到一个网站成立的时间? 请教一个类的实例化问题
但是,在PHP5里,默认已经是按引用传递了,所以当你在PHP5里不建议使用&了。
class a
{
public $a = 1;
function __construct()
{
$this->a = 0;
}
function out()
{
$this->a ++;
echo $this->a;
}
}$a = &new a();$a->out();
$a->out();
class T{}
$t = new T();
$s = $t;
$t->str = '性别男,爱好女';echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
这个也不算是区别大,算是以前的PHP的BUG吧。在PHP4里。
$obj = new obj();//$obj则并不是一个obj对象
$obj = &new obj();//$obj才是个对象。这就是按引用传递和按值传递的区别所以到现在还有很多人还习惯用$obj = &new obj();这种方式来建立对象。
但在php5里就无所谓了
function test(){
return 1;
}
}$test = new test();
var_dump($test);$test = &new test();
var_dump($test);
这个例子是因为变量与变量之间引用同一个zval,refcount为2,未分离
改成下面就会有一个分离过程。
class T{}
$t = new T();
$s = $t;
$n = &$t;
$t->str = '性别男,爱好女';
unset($t);
echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
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);
$t = new T();
$s = $t;
$n = &$t;
$t->str = '性别男,爱好女';
$t = null;//不该用unset
echo $n->str;//nothing...
echo $s->str;//php5+,大家猜猜输出了什么?,或许能对本楼有点贡献
$t = null是改变引用的值?然后$s是$t=null赋值前拷贝出来的?
还是有点不明白额。php5 中 new T()不是已经是对象引用了么。 然后$s也应该是T对象的引用吧。为什么没有变成NULL呢。。
画蛇添足!
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
但是$s仍然是关联zval的。
我说不明白,有一篇高手写的文章专门讲这个的,在本坛我贴出来不少次了,你认真看看。
http://www.laruence.com/2008/08/22/412.html
http://www.laruence.com/2008/09/19/520.html
然后再结合php的GC原理会更深入一些。
http://www.php.net/manual/en/features.gc.refcounting-basics.php
$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);
thanks老虎提供的地址。
的却可以学到很多。
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增加了,但函数调用的时候没有增加
$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;
}
睡觉。。结贴。。