PHP中变量的传递有两种方式
1、按值传递,不同变量间在内存中引用的是不同的地址,函数范围内对值的任何改变在函数外部都会被忽略
2、按引用传递,虽然是不同变量名,但是引用的却是同一个内存地址,函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:
A:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
B.按引用传递则不需要复制值,对于性能提高很有好处。
& 引用传递
先来看一个例子,代码如下
<?php
$a=1;
function test($a){
$a=2;
}
test($a);
echo $a;
?>
运行此程序,会输出 1。
因为每当运行到一个函数时,就会在内存开辟一个<strong>新栈</strong>,并在这个新栈中有变量 $a,并且赋值2,这时它并不会影响到原先栈中的变量$a=1这个值。<strong>所以,可以这么理解吧,不同栈之间的变量是不会互相影响的。</strong>
原理类似下图:
当使用了 &符时,
<?php
$a=1;
function test(&$a){
$a=2;
}
test($a);
echo $a;
?>
则会输出 2,因为函数外的变量和函数内的变量引用了同一个内存地址,函数内的变量a值变了,外面的则跟着变,原理图如下:
static
代码示例如下
function test(){
static $a=2;
$a++;
echo $a;
if($a<4){
test();
}
}
test();
这将会输出 3 4
以上这个其实有点像引用传递,不过它不是内存地址的引用原理,它是把变量放入到<strong>静态存储区</strong>这,这个是对当前函数作用域才有效的。
注意
静态变量与引用传递共同使用,会互相影响
<?php
function test(){
static $a;
$b = 1;
var_dump($a);
$a = &$b;
}
test();
test();
?>
以上代码只会输出两个NULL
去掉&符号,再运行一次,
<?php
function test(){
static $a;
$b = 1;
var_dump($a);
$a = $b;
}
test();
test();
?>
这样会输出 NULL int(1)