php开源嘛
首页 | English | MySql数据库 | Php编程 | 建站杂烩 | 系统服务器 | 资源共享 | 专题 | 才桀网 | 支持论坛
  当前位置:主页>Php编程>文章内容
php中class类的构造函数中的引用
来源:php手册 作者:本站整理 发布时间:2007-12-18  

php中class类的构造函数中的引用 phpma.com

在构造函数中创建引用可能会导致混淆的结果。本节以教程形式帮助避免问题。

<?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 */
?>

显然没有区别,但实际上有一个非常重要的区别:$bar1$globalref[0] 并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝。

注: 在返回拷贝而不是引用中并没有性能上的损失(因为 PHP 4 及以上版本使用了引用计数)。相反更多情况下工作于拷贝而不是引用上更好,因为建立引用需要一些时间而建立拷贝实际上不花时间(除非它们都不是大的数组或对象,而其中之一跟着另一个变,那使用引用来同时修改它们会更聪明一些)。

要证明以上写的,看看下面的代码。 phpma.com

<?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 */
?>

最后给出另一个例子,试着理解它。 phpma.com

<?php
class
A
{
   function
A($i
)
   {
      
$this->value = $i
;
      
// 试着想明白为什么这里不需要引用
      
$this->b = new B($this
);
   }

   function
createRef
()
   {
      
$this->c = new B($this
);
   }

   function
echoValue
()
   {
       echo
"<br>","class ",get_class($this),': ',$this->value
;
   }
}


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

   function
echoValue
()
   {
       echo
"<br>","class ",get_class($this),': ',$this->a->value
;
   }
}

// 试着理解为什么这里一个简单的拷贝会在下面用 *
// 标出来的行中产生预期之外的结果
$a =& new A(10
);
$a->createRef
();

$a->echoValue
();
$a->b->echoValue
();
$a->c->echoValue
();

$a->value = 11
;

$a->echoValue
();
$a->b->echoValue();
// *
$a->c->echoValue
();

/*
输出为:
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11
*/
?>

(阅读次数:
上一篇:MySQL数据库所支持的操作系统有那些?   下一篇:Linux操作系统Fork的使用{系统服务器}
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·PHP生成验证码图片的源代码
·PHP会话对(Session)使用入门
·Php部分常见问题总结[bug]
·php正则表达式的快速学习方法
·高手传经:学习PHP重在坚持
·用php生成静态页面的php函数
·PHP对文本数据库的基本操作方法
·用 PHP 读取文件的正确方法
·讲解PHP+MySQL的分页显示示例
·用PHP构建一个简易监视引擎
·我是怎样打造简单的PHP&MYSQL留
·用PHP实现表单验证码登陆校验
  相关文章
·php类class中的构造函数中的引用
·mysql_select_db()与mysql_resul
·php类中序列化对象与__sleep和__
·PHP 4 与 PHP 5 中对象的范例比
·mysql_fetch_array()与mysql_fet
·怎样用PHP插件实现MySQL为基础的
·mysql_errno()与mysql_error ()
·怎样用php过滤危险html代码
·PHP编程:怎样用发散思维学习PHP
·怎样用PHP加密URL的实现方法
·php的xml分析函数、精彩阅读...
·mysql_db_query()与mysql_query(

关于我们 | 本站声明 | 友情连接 | 诚邀加盟 | 网站地图
版权Power by DedeCms   技术支持QQ =>> 罗江游鱼   Jacking  后台登陆
Copyright @ 2007 公司地址:柳州市东环路268号 邮编:545006 电话:15920389818 桂ICP备07006725号