在C++中引用变量只是被引用变量的别名,他们同时指向的都是同一片内存空间。
变量上的引用
php的引用允许你用两个变量指向同一个内容
$a = 123;
$b = &$a;
echo $b;
$b = 456;
echo $a;
上面这个代码,定义了 a 的 值 为 123 , a的值为123, a的值为123,b引用了 a 所 以 他 们 两 个 指 向 的 是 同 一 个 内 容 , 第 一 次 输 出 a所以他们两个指向的是同一个内容,第一次输出 a所以他们两个指向的是同一个内容,第一次输出b也就是输出 a 的 值 , 当 a的值,当 a的值,当b的值发生变化时,因为指向的是同一个内容,所以$a也发生相同的变化,a输出就是456
函数上的引用
函数的引用
函数的引用相当于变量引用的升级版,此时的被引用变量放在了函数里面。
function &test() {
static $a = 0;
$a = $a + 1;
echo $a."\n";
return $a;
}
$b = test();
$b = 456;
test();
$b = &test();
$b = 456;
test();
ps:函数引用必须要注意以下两点
1.函数名字加上了引用标记
2.返回必须是被引用的变量,不能是常量
上面代码定义了一个函数test,里面设置了一个静态变量,每次执行都会进行加1的操作。
下方第一段代码:
执行test函数把执行完以后的值赋值到b上,更改b的值,然后再执行test函数,观测a的值是否被b改变了,结果显示a的输出1,2。
如果使用函数的时候没有加上&引用则会当成正常的函数来使用。
下方第二段代码:
引用执行test函数并赋值到b上,更改b的值,然后再执行test函数,观测a的值是否被b改变了,结果显示a输出3,457。
很明显b引用了函数里面a的值,当b的值发生变化时,a的值也发生了变化。
函数的传值引用
这个传值引用跟变量引用有点类似
function test(&$a) {
$a = $a + 100;
echo $a."\n";
}
$b = 1;
test($b);
echo $b;
上方定义了一个test函数,里面的参数用的是引用参数,接着定义了一个值为1的变量b,将b当做test的参数进行执行test函数,test函数的形参a就引用了b的值,此时形参a和变量b指向的都是同一片内存地址,当a的值发生变化时,b也会跟着a一起变化。所以结果输出为101
对象中的引用
class a {
public $param = 123;
}
$b = new a();
$c = $b;
$d = &$b;
$e = clone $b;
echo $b->param.PHP_EOL;//123
echo $c->param.PHP_EOL;//123
echo $d->param.PHP_EOL;//123
echo $e->param.PHP_EOL;//123
$c->param = 456;
echo $b->param.PHP_EOL;//456
echo $c->param.PHP_EOL;//456
echo $d->param.PHP_EOL;//456
echo $e->param.PHP_EOL;//123
上方代码定义了一个类为a
b是a的实例化对象,c是b的赋值,d是b的引用,e是b的克隆
当在类中的变量值不改变得时候,输出都是123
当把c对象中的变量值改为456以后,b,c,d的输出都变成了456,只有e的值没有改变。
结论:对象的赋值其实就是对象的引用,如果想要拷贝一个变量,则需要用clone方法进行拷贝;
引用的作用
- 可以通过别名访问某个对象或变量
- 可以减少内存使用量
- 引用函数作用特别大,当函数里变量的对象会随着外面的更改而更改