美文网首页
引用变量 --- 2021-11-13

引用变量 --- 2021-11-13

作者: 一位先生_ | 来源:发表于2021-11-13 18:35 被阅读0次

概念:
在PHP中引用变量意味着,使用不同的变量名去访问同一个变量的内容。

定义方式:使用 & 符号

demo1.php

<?php 

//定义一个变量
$a = range(1,9999);
var_dump(memory_get_usage());//获取为变量开辟空间变化

//定义变量b 将变量a的值赋值给变量b
//cow 机制 copy on write
$b = $a;

var_dump(memory_get_usage());

//对变量a进行修改
$a = range(1,9999);

var_dump(memory_get_usage());


 ?>

总结:变量a发生了改变,因cow机制,会进行开辟内存空间,内存空间发生变化。
demo2.php

<?php 

//定义一个变量
$a = range(1,9999);
var_dump(memory_get_usage());

//定义变量b 将变量a的值赋值给变量b
//cow 机制 copy on write
$b = &$a;

var_dump(memory_get_usage());

//对变量a进行修改
$a = range(1,9999);

var_dump(memory_get_usage());


 ?>

总结:demo2和demo1相比较,变量b 引用了变量a的地址空间,即使变量a发生了改变,空间也不会发生改变。

demo3.php(这个需要自己安装xdebug扩展)

<?php 

    //zval 变量容器
    $a = range(0, 5);
    xdebug_debug_zval('a');

    //将变量a的值赋值给b
    $b = $a;
    xdebug_debug_zval('a');

    $a = range(0, 5);
    xdebug_debug_zval('a');
 ?>

运行结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)

总结:将变量a赋值给变量b refcount值加1,此时为2,但是并没有引用;当变量a的值发生改变时,refcount从1开始,此时也没有引用 is_ref为0 即false。

demo4.php

<?php 

    //zval 变量容器
    $a = range(0, 5);
    xdebug_debug_zval('a');

    //将变量a的值赋值给b
    $b = &$a;
    xdebug_debug_zval('a');

    $a = range(0, 5);
    xdebug_debug_zval('a');
 ?>

结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)

a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)

a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1, 2 => (refcount=0, is_ref=0)=2, 3 => (refcount=0, is_ref=0)=3, 4 => (refcount=0, is_ref=0)=4, 5 => (refcount=0, is_ref=0)=5)

总结:demo4相比较于demo3使用了引用,即变量b引用了变量a; 在引用之后refcount还是2,并不会开辟新的空间;
is_ref = 1; 说明使用了引用变量。

demo5.php

<?php 

    //unset只会取消引用,并不会销毁空间
    $a = 1;

    $b = &$a;

    unset($b);
    var_dump($a);
    // echo $b; //b 此时已经进行了销毁

 ?>

总结:unset只会取消引用,但并不会销毁空间地址,因为此时打印出变量a的值是1。

demo6.php

<?php 

//对象本身就是引用传值
class Person {
    public $name = 'zhangsan';
}

$p1 = new Person();

xdebug_debug_zval('p1');

$p2 = $p1;
xdebug_debug_zval('p1');


$p2->name = 'lisi';
xdebug_debug_zval('p1');

 ?>

结果:
p1: (refcount=1, is_ref=0)=class Person { public name = (refcount=0, is_ref=0)='zhangsan' } p1: (refcount=2, is_ref=0)=class Person { publicname = (refcount=0, is_ref=0)='zhangsan' }
p1: (refcount=2, is_ref=0)=class Person { public $name = (refcount=0, is_ref=0)='lisi' }

总结:对象本身就是引用传值

example.php

<?php 
    $data = [a,b,c];

    foreach ($data as $key => $value) {
        $value = &$data[$key];
        var_dump($data);
    }
    var_dump($data);

 ?>

结果:
/home/example.php:6:
array(3) {
[0] =>
string(1) "a"
[1] =>
string(1) "b"
[2] =>
string(1) "c"
}
/home/example.php:6:
array(3) {
[0] =>
string(1) "b"
[1] =>
string(1) "b"
[2] =>
string(1) "c"
}
/home/example.php:6:
array(3) {
[0] =>
string(1) "b"
[1] =>
string(1) "c"
[2] =>
string(1) "c"
}
/home/example.php:8:
array(3) {
[0] =>
string(1) "b"
[1] =>
string(1) "c"
[2] =>
string(1) "c"
}

image.png

相关文章

  • 引用变量 --- 2021-11-13

    概念:在PHP中引用变量意味着,使用不同的变量名去访问同一个变量的内容。 定义方式:使用 & 符号 demo1.p...

  • shell脚本学习(二)[变量,转义,运算符等]

    Chapter8 变量的引用 变量的引用 1.1 ${变量名}称作对变量的引用。 1.2 echo ${变量名}查...

  • 小鸟初学Shell编程(七)变量引用及作用范围

    变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式。 ${变量名}称作为对变量的引用 echo $...

  • 2. php基础-引用变量的考点

    引用变量的考点 真题: 什么是引用变量? 在PHP当中,用什么符号定义引用变量? 考点:PHP的引用变量的概念及定...

  • php基础知识面试点

    引用变量考察点 回顾真题什么是引用变量?在php中,用什么符号定义引用变量? 考点分析分析:考官考点PHP引用变量...

  • PHP之-基础知识考查

    引用变量 真题 什么是引用变量 在PHP中用什么符号定义引用变量(概念及定义方式 php引用变量的原理)1 用不同...

  • 第八章 函数探幽(2)引用变量

    (二)引用变量 1.引用变量的典型用途 是用作函数的形参,通过将引用变量用作参数,函数将传递变量的引用,从而可以...

  • 引用变量

    一.定义 概念: 再PHP中引用意味着用不同的名字访问同一个变量内容 定义方式: 使用 & 符号 二.机制 cop...

  • 变量引用

    ''' print("hellow") name = "Li" age = 21 province = "lian...

  • 引用变量

    定义:用不同的名字访问同一变量内容 以下两段代码a均指向同一内存空间 Tips: 使用 unset() 只会取消引...

网友评论

      本文标题:引用变量 --- 2021-11-13

      本文链接:https://www.haomeiwen.com/subject/gbtzzltx.html