麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
再探 Php4 的引用——让我再裤一把吧
悬赏分:20 - 2007年08月17日

过把瘾就挂也好:blowzy:

  因为工作上的限制,我还是在 PHP4 上举步不前。同样因为工作的需要,今天碰到对引用要求比较高的地方。需要验证的地方在于,如果在一个实例中引入一个值到属性,而这个值在过程中会同样引入到另外一个原型构建的对象中,那么,如果在另外一个对象中对相应属性进行更新,第一个实例的对应属性是否也会被更新?
  为此,我尝试写了下面一段测试代码:
[PHP]class x
{
var $a;

function & y ( $a = 0 )
{
$this->a = & $a;
return new y( $a );
}
}

class y
{
var $a;

function y ( & $a )
{
$this->a = & $a;
}

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

$x = new x;
$y = & $x->y( 1223 );
$y->z( 2334 );

var_export( $x );[/PHP]
  毫无疑问,因为仓促和考虑的疏忽,这个例子根本不能体现想法出来,结果失败是毫无疑问的。但错误的原因究竟是出在哪儿?在这个例子中,x:a 与 y:a 是通过 y::y() 方法中的参数引用而建立确切关联的。
  难道说引用仅仅是单方向的?为此我写了下面一个测试,结果证实,引用正如手册中所说的,是两个变量名称指向同一个变量实体,变更一个,另外一个的表现也会随之而变更。
[PHP]$x = 1;
$y = & $x;
$y = 2;

var_export( $x );[/PHP]
  回头仔细检查第一个测试脚本的代码,最后找到导致错误的地方在于 y::z() 方法中对 y:a 赋值的这一行语句:
[PHP]$this->a = & $a;[/PHP]
  这样的操作意味着解除原有的引用关系,改引用到新的 $a 变量上。这样导致 x:a 和 y:a 的同步失败。而 x::y() 方法中的相同语句无误的原因则在于两者是通过 $a 来确定引用同步关系,哪怕此 $a 在生存周期——方法过程完结后空间被系统回收,x:a 与 y:a 的关系仍旧保持引用。
  如果在定义 x::y() 方法时不对 $a 进行引用,就必须重新定义方法为:
[PHP]function & y ( $a = 0 )
{
$this->a = $a;
return new y( $this->a );
}[/PHP]
  小小体会,记录下来与大家共享之。

提问者:snakevil   08-17 11:11
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
60 + 55 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM