background image

谨慎使用 PHP 的引用原因分析

  PHP 中也引入了引用类型,在对对象赋值传递上,基本可视为是同于 Java/C#的引用
传递(具体请见 Objects 

and

 references)。但同时又支持在基础类型上通过引用运算符(&)

来获得内容的引用。不过在实际的使用中,PHP 的引用类型因为整个 PHP 设计结构而存
在着许多的问题,使得在程序出现非预计的结果
  引用类型(Reference)在许多计算机语言中都被使用,而且是作为一个非常强大而实用
的特性存在。它有类似指针(Pointer)的实现,却又有不同于指针的表现。例如 C++的引用,
可以让不同变量指向同一个对象,同时又保有直接使用 dot 来获取对象成员,不用繁琐
的使用 dereference 运算符(*)和 Pointer to Member 运算符(->)。Java 和 C#中就直接以引用为
主要类型,尽量让开发人员避免使用指针。
  PHP 中也引入了引用类型,在对对象赋值传递上,基本可视为是同于 Java/C#的引用
传递(具体请见 Objects 

and

 references)。但同时又支持在基础类型上通过引用运算符(&)

来获得内容的引用。不过在实际的使用中,PHP 的引用类型因为整个 PHP 设计结构而存
在着许多的问题,使得在程序出现非预计的结果。
 
 

 

引用变量可被赋予新的引用
 
在 C++中,引用类型的变量只能在其定义时被赋予引用值,所以我们只要追踪到变量的

 

定义处就可以知道变量是在操作哪个内容。
 
但是 PHP 不同,PHP 里模糊了变量的定义,可以不定义就使用的变量。所以可以让变量

 

被多次赋予引用值。
代码如下:
 

$x

 = 21; 

$y

 = 7; 

 

$z

 = &

$x

$z

 = &

$y

 
var_dump(

$x

,

$y

,

$z

); 

 
初次看起来,让人的感觉是

$z

变成了对

$x

的引用,然后让

$z

的内容变成了对

$y

的引用,

也就是说

$x

$z

都成对

$y

 

的引用。但是实际输出结果是:

代码如下:
 
int(21) 
int(7) 
int(7)