首先看一下下面的例子:
$a = "val1";
$b = "val2";
$a = &$b;
echo $a."<br/>";
$b = "123";
echo $a;
上述的例子中如果将代码的 $a=&$b
换成 $a=$b
则 $a 的两次输出的值都是相同的,但是添加了 & 符号则将 $b 和 $a 的内存地址指向了相同的内存,所以更改了 $b,$a 也会跟着改变!
再看看下面的这个例子:
function &test()
{
static $b = 0;
$b = $b + 1;
echo $b;
return $b;
}
$a = test(); //$b=1
$a = 5;
$a = test(); //$b=2
$a = &test(); //$b=3
$a = 5;
$a = test(); //$b=6
通过这种方式 $a=test();
得到的其实不是函数的引用返回,这跟普通的函数调用没有区别.
至于原因:
这是 PHP 的规定。PHP 规定通过
$a=&test()
方式得到的才是函数的引用返回。
至于什么是引用返回呢(PHP 手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时)
用上面的例子来解释就是:
$a=test()
方式调用函数,只是将函数的值赋给 $a 而已,而 $a 做任何改变都不会影响到函数中的 $b。
而通过 $a=&test()
方式调用函数呢,他的作用是将 return $b
中的 $b 变量的内存地址与 $a 变量的内存地址,指向了同一个地方。即产生了相当于这样的效果 $a=&b
所以改变 $a 的值,也同时改变了 $b 的值。所以在执行了 $a=&test(); $a=5;
以后,$b 的值变为了 5。
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中。
另附一个 PHP 官方例子:
// This is the way how we use pointer to access variable inside the class.
class talker{
private $data = 'Hi';
public function & get(){
return $this->data;
}
public function out(){
echo $this->data;
}
}
$aa = new talker();
$d = &$aa->get();
$aa->out();
$d = 'How';
$aa->out();
$d = 'Are';
$aa->out();
$d = 'You';
$aa->out();
// the output is "HiHowAreYou"