PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 入门和基础知识 » Php4 的引用
本页主题: Php4 的引用 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

自由的龙

该用户目前不在线
级别: 中级程序员
精华: 1
发帖: 1264
威望: 1267 点
金钱: 12660 PYMB
贡献值: 0 点
在线时间:0(小时)
注册时间:2006-04-16
最后登录:2006-06-27

Php4 的引用


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


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


CODE:[Copy to clipboard]<?php
$x = 1;
$y = & $x;
$y = 2;

var_export( $x );
?>
  回头仔细检查第一个测试脚本的代码,最后找到导致错误的地方在于 y::z() 方法中对 y:a 赋值的这一行语句:


CODE:[Copy to clipboard]<?php
$this->a = & $a;
?>
  这样的操作意味着解除原有的引用关系,改引用到新的 $a 变量上。这样导致 x::$a 和 y::$a 的同步失败。而 x::y() 方法中的相同语句无误的原因则在于两者是通过 $a 来确定引用同步关系,哪怕此 $a 在生存周期——方法过程完结后空间被系统回收,x::$a 与 y::$a 的关系仍旧保持引用。
  如果在定义 x::y() 方法时不对 $a 进行引用,就必须重新定义方法为:


CODE:[Copy to clipboard]<?php
function & y ( $a = 0 )
{
  $this->a = $a;
  return new y( $this->a );
}
?>
  小小体会,记录下来与大家共享之。
顶端 Posted: 2006-04-16 16:21 | [楼 主]
PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 入门和基础知识

时:12-02 07:54 Copyright © 2006 phpwhy.com 权
ICP05060669

曳息 -