谨慎使用 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)