当前位置: 首页 > 图文教程 > 网络编程 > PHP > 为您详解PHP开发工具的使用与分析

PHP
PHP新手总结的PHP基础知识
php实现gb2312和unicode间编码转换
用php语言实现数据库连接详细代码介绍
详细解析 PHP 向 MySQL 发送数据过程
利用PHP V5开发多任务应用程序
详细讲解PHP中缓存技术的应用
php escapeshellcmd多字节编码漏洞
《PHP设计模式介绍》导言
《PHP设计模式介绍》第一章 编程惯用法
《PHP设计模式介绍》第二章 值对象模式
《PHP设计模式介绍》第三章 工厂模式
《PHP设计模式介绍》第四章 单件模式
《PHP设计模式介绍》第五章 注册模式
《PHP设计模式介绍》第六章 伪对象模式
《PHP设计模式介绍》第七章 策略模式
《PHP设计模式介绍》第八章 迭代器模式
《PHP设计模式介绍》第九章 观测模式
《PHP设计模式介绍》第十章 规范模式
《PHP设计模式介绍》第十一章 代理模式
《PHP设计模式介绍》第十二章 装饰器模式

为您详解PHP开发工具的使用与分析


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 202 ::
收藏到网摘: n/a

有一段时间一直迷惑于PHP中引用的传递,后来查手册及C源程序,并反复测试,大致对引用传递在内存中的模式有了一定的了解,后来为了加深印象,写了个总结,应该不会有大的问题——当然这是在PHP4中,在以后的版本中可能会有变化。当时写总结的时候,想锻炼一下英语,因此就凑合了一篇。不过本人英语不好,也懒得翻译,反正当时想自己看得懂就行了。今天心血来潮,突然觉得还蛮有用的,于是在这里现丑了,请大家指正。那位看得懂的帮忙翻译一下吧,我没空了。

以下为引用的内容:

<?php 
/* 

filename: SetGetTest.php 

comment on assignment by value and referrence 
assuming $var is a varialbe, its handle(pointer) is named as *var, 
and its content is named as @var 

the memory area of @var is referred by *var, if the *var is the same,  
then the memory areas are the same, so *var is just like a pointer. 

1. when $var = $var1 
@var copied from @var1, but in the different memory area,  
new *var assigned by the system, pointing to the memory area holding @var 
*var and *var1 are different 

2. when $var =& $var1, 
*var assigned by *var1, and the @var is not assigned or copied,  
it is absolutely the same as @var1, and in the same memory area 
both *var and *var1 pointing to the memory area, that means they are the same. 

passing by referrence 
3.  
function set1(&$s){ 
$var =& $s; 

set1($var1) results: 
*var1 passing to the function, and *s is the same as *var1, 
then *var is the same as *s, the result is that *var is the same as *var1 
and all the contents are the same obviously. 

4. 
function set2(&$s){ 
$var = $s; 

set2($var1) results: 
*var1 passing to the function, and *s is the same as *var1, 
but when $var = $s executes, from 1. we can see @var is the same as @s,  
but *var is different from *s, so @var and @s is not in the same memory area, 
while @s and @var1 is sharing the same memory area, also *var1 and *s are the same. 

5. 
normal function return: 
function get(){ return $var1; } 
assuming the result is referred by a variable $result. 
then @result is copied from @var1 but *result is not the same as *var1 
when $var = get(); 
first you get a variable $result, as I said above, @result is the same as @var1, but *result 
is different from *var1, and next $var = $result executes.  
As I said in 1., you can find, @var is the same as @result and the same as @var1,  
but *var is different from *result AND *var1; 

while $var =& get() just means: 
*var is the same as *result, so @var and @result are in the same memory area,  
but they are still different from those of $var1,  
both the memory area of @var1 and *var1, 

 


6. 
returning by referrence 
function &get(){ return $var1; } 
there are two ways to get the result 

$var = get(); and $var =& get(); now I will tell the difference 
I. $var = get(); 
the *result is the same as *var1 and so @result and @var1 are the same. 
and then $var = $result executes,  
*var is not the same as *result, and also different from *var1,  
but their contents are the same. 

I. $var =& get(); 
the *result is the same as *var1 and so @result and @var1 are the same. 
and then $var =& $result executes,  
this means $var and $result are the same, both of @ and * 

*/ 

// the test is the following 

function println($s = ""){ 
print "$s<br>\n"; 

class GetSetTest 

var $var = null; 

function setByRef(&$arg){ 
$this->var =& $arg; 

function passByRef(&$arg){ 
$this->var = $arg; 

function setByVal($arg){ 
$this->var = $arg; 

function &getByRef(){ 
return $this->var; 

function getByVal(){ 
return $this->var; 

$o = new GetSetTest; 

println("============ setByRef getByRef ============="); 
println("-----------------Before change----------------"); 
$in = "before change"; 
$o->setByRef($in); 
$outByVal = $o->getByRef(); 
$outByRef =& $o->getByRef(); 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println("-----------------After change-----------------"); 
$in = "after change"; 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println(); 

println("============ setByRef getByVal ============="); 
println("-----------------Before change----------------"); 
$in = "before change"; 
$o->setByRef($in); 
$outByVal = $o->getByVal(); 
$outByRef =& $o->getByVal(); 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println("-----------------After change-----------------"); 
$in = "after change"; 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println(); 

println("============ passByRef getByVal ============="); 
println("-----------------Before change----------------"); 
$in = "before change"; 
$o->passByRef($in); 
$outByVal = $o->getByVal(); 
$outByRef =& $o->getByVal(); 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println("-----------------After change-----------------"); 
$in = "after change"; 
println("\$in: ".$in); 
println("\$outByVal: ".$outByVal); 
println("\$outByRef: ".$outByRef); 
println("\$this->var: ".$o->var); 
println(); 

/* 
以下输出结果是我(夜猫子)擅自编辑添加的,主要是为后来人查看方便加在这里,越肉代庖,向longnetpro致歉 
输出结果: 
============ setByRef getByRef ============= 
-----------------Before change---------------- 
$in: before change 
$outByVal: before change 
$outByRef: before change 
$this->var: before change 
-----------------After change----------------- 
$in: after change 
$outByVal: before change 
$outByRef: after change 
$this->var: after change 

============ setByRef getByVal ============= 
-----------------Before change---------------- 
$in: before change 
$outByVal: before change 
$outByRef: before change 
$this->var: before change 
-----------------After change----------------- 
$in: after change 
$outByVal: before change 
$outByRef: before change 
$this->var: after change 

============ passByRef getByVal ============= 
-----------------Before change---------------- 
$in: before change 
$outByVal: before change 
$outByRef: before change 
$this->var: before change 
-----------------After change----------------- 
$in: after change 
$outByVal: before change 
$outByRef: before change 
$this->var: after change 
*/ 

?>