![]() |
|
首页 │ Apache │ Linux│ Java│ MySQL│ 注册│帮助 | |||
过把瘾就挂也好: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]
小小体会,记录下来与大家共享之。

