Menu Close

php之引用

今天看别人的代码,在类的静态变量前加了&符号,类似于下面

class c
{
    static function &instance() {}
}

倍感好奇,查了一下,总结出来写于下:

1.什么叫引用?以及怎么使用引用。
2.引用的方式是什么?包括变量、函数、类。
3.引用的作用

1.1 什么叫引用

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址…… 查看引用不是什么了解更多信息。 替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接

官方介绍 http://php.net/manual/zh/language.references.whatare.php
熟悉Linux的话,可以参考ln命令,将一个文件硬链接到其他目录,修改任意文件,则两个文件都会被修改.

说白了,就是用不同的名字访问同一个变量内容,假如有变量a,变量b引用了变量a。则变量a和b都可以访问、修改变量a的内容。

1.2 如何使用引用

在需要引用的对象前加&符号.

2.1 变量的引用方式

在需要引用的变量前加上&符号。

$a = 123;
$b = &$a;
#输出123
echo $a;
#输出123
echo $b;
$b = 456;
#输出456.
echo $a;

2.2 函数的引用方式

2.2.1 引用传递

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:
官方提供了一个例子

<?php
function foo(&$var)
{
    $var++;
}
$a=5;
foo($a);
// $a is 6 here
echo $a;
?>

上面的例子中,如果形参前没有加&符号,则在函数调用后,$a的值为5,加上&符号后,在函数调用后,$a的值就为6. 这是因为在函数中$var的值进行的改变,影响了函数外的变量.

注意,只有以下内容可以通过引用传递:

  1. 变量,例如 foo($a)
  2. New 语句,例如 foo(new foobar())
  3. 从函数中返回的引用,例如:

如果在上面调用foo(5),就会报告一个致命错误,必须得是变量才可以

Fatal error: Only variables can be passed by reference

2.2.2 引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:

<?php
class foo {
    public $value = 42;
    #注意这里,只有&符号,没有$符号
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
#myValue的值是42,并将myValue的地址和对象中的value绑定
$myValue = &$obj->getValue();
#修改value的值,也就是修改了myValue的值
$obj->value = 2;
#输出2
echo $myValue;              

3 PHP的引用作用。

上面的例子其实已经能够说明,PHP 的引用允许用两个变量来指向同一个内容。

总结

回到最初的问题

    static function &instance() {}

其实就是一个单例,但不知道为什么这么写,猜测,在后面调用instance时,如果不带引用则普通读取,带引用则可以修改此单例.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注