$db = new db();
$db = &new db();这两种$db有什么区别。
解决方案 »
- PHP删除指定字符。
- Warning: mysql_query(): 9 is not a valid MySQL-Link resource in ?
- 继承
- 求一正则表达式(路径转换)!谢谢
- 从MYSQL表中查询到所要删除的文件名,但是删除该文件出错!为什么呢?
- 如何实现sqlServer导入到mysql?有分
- 创建完一个session后随即跳转到另一个页面,但session已不在????
- html问题
- 我怎么写一句sql 来实现 自动增加的字段 , 从1 开始 ,每次加1 呢?
- php使用laravel框架,访问时403错误,根目录定位到public就可以访问了,为什么呢?求解答,谢谢
- 我想问一下,有没有办法可以查到一个网站成立的时间?
- 请教一个类的实例化问题
但是,在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;
}
睡觉。。结贴。。