php 构造函数中的引用
<?phpclassFoo{functionFoo($name){//在全局数组$globalref中建立一个引用global$globalref;$globalref[...
<?php
class Foo {
function Foo($name) {
// 在全局数组 $globalref 中建立一个引用
global $globalref;
$globalref[] = &$this;///???
// 将名字设定为传递的值
$this->setName($name);
// 并输出之
$this->echoName();
}
function echoName() {
echo "<br />",$this->name;
}
function setName($name) {
$this->name = $name;
}
}
?>
下面来检查一下用拷贝运算符 = 创建的 $bar1 和用引用运算符 =& 创建的 $bar2 有没有区别...
<?php
$bar1 = new Foo('set in constructor');
//$bar1->echoName();
//$globalref[0]->echoName();
/* 输出:
set in constructor
set in constructor
set in constructor */
$bar2 =& new Foo('set in constructor');
//$bar2->echoName();
//$globalref[1]->echoName();
/* 输出:
set in constructor
set in constructor
set in constructor */
?>
<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');
// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();
/* 输出为:
set from outside
set in constructor */
// 现在看看 $bar2 和 $globalref[1] 有没有区别
$bar2->setName('set from outside');
// 幸运的是它们不但相同,根本就是同一个变量。
// 因此 $bar2->name 和 $globalref[1]->name 也是同一个变量。
$bar2->echoName();
$globalref[1]->echoName();
/* 输出为:
set from outside
set from outside */
?>
这里<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');
// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();
/* 输出为:
set from outside
set in constructor */按照手册(显然没有区别,但实际上有一个非常重要的区别:$bar1 和 $globalref[0] 并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝)输出为set in constructor 但实际输出为set from outside。
这是什么原因啊。
是指globalref[0] 展开
class Foo {
function Foo($name) {
// 在全局数组 $globalref 中建立一个引用
global $globalref;
$globalref[] = &$this;///???
// 将名字设定为传递的值
$this->setName($name);
// 并输出之
$this->echoName();
}
function echoName() {
echo "<br />",$this->name;
}
function setName($name) {
$this->name = $name;
}
}
?>
下面来检查一下用拷贝运算符 = 创建的 $bar1 和用引用运算符 =& 创建的 $bar2 有没有区别...
<?php
$bar1 = new Foo('set in constructor');
//$bar1->echoName();
//$globalref[0]->echoName();
/* 输出:
set in constructor
set in constructor
set in constructor */
$bar2 =& new Foo('set in constructor');
//$bar2->echoName();
//$globalref[1]->echoName();
/* 输出:
set in constructor
set in constructor
set in constructor */
?>
<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');
// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();
/* 输出为:
set from outside
set in constructor */
// 现在看看 $bar2 和 $globalref[1] 有没有区别
$bar2->setName('set from outside');
// 幸运的是它们不但相同,根本就是同一个变量。
// 因此 $bar2->name 和 $globalref[1]->name 也是同一个变量。
$bar2->echoName();
$globalref[1]->echoName();
/* 输出为:
set from outside
set from outside */
?>
这里<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');
// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();
/* 输出为:
set from outside
set in constructor */按照手册(显然没有区别,但实际上有一个非常重要的区别:$bar1 和 $globalref[0] 并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝)输出为set in constructor 但实际输出为set from outside。
这是什么原因啊。
是指globalref[0] 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询