今天看别人的代码,在类的静态变量前加了&符号,类似于下面
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的值进行的改变,影响了函数外的变量.
注意,只有以下内容可以通过引用传递:
- 变量,例如 foo($a)
- New 语句,例如 foo(new foobar())
- 从函数中返回的引用,例如:
如果在上面调用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时,如果不带引用则普通读取,带引用则可以修改此单例.