static 与 & 引用传递

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>

原理类似下图:

Paste_Image.png

当使用了 &符时,

<?php
$a=1;
function test(&$a){
    $a=2;
}
test($a);
echo $a;
?>

则会输出 2,因为函数外的变量和函数内的变量引用了同一个内存地址,函数内的变量a值变了,外面的则跟着变,原理图如下:

Paste_Image.png

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)

所以,最好别把 & 引用传递和 static 混合使用,否则容易出错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容