关于变量和函数前 & 符号的作用

老牛浏览 297评论 0发表于

首先看一下下面的例子:

php
$a = "val1";
$b = "val2";
$a = &$b;
echo $a."<br/>";
$b = "123";
echo $a;

上述的例子中如果将代码的 $a=&$b 换成 $a=$b 则 $a 的两次输出的值都是相同的,但是添加了 & 符号则将 $b 和 $a 的内存地址指向了相同的内存,所以更改了 $b,$a 也会跟着改变!

再看看下面的这个例子:

php
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 官方例子:

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"
点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于