美文网首页
PHP-引用变量

PHP-引用变量

作者: AGEGG | 来源:发表于2019-03-06 23:05 被阅读0次

1.&引用变量

//定义变量a,为变量a在内存中开辟一块空间
$a = range(0,1000);
var_dump(memory_get_usage());
//COW Copy On Write 机制 $b指向了$a的内存空间,共享空间
$b = $a;
var_dump(memory_get_usage());

//对$a进行修改 此时,$b还是指向$a创建出来的空间,$a修改了,因此copy出$a指向新开辟的空间
$a = range(0,1000);
var_dump(memory_get_usage());
$a = range(0,1000);
var_dump(memory_get_usage());
//$b指向$a的内存空间
$b = &$a;
var_dump(memory_get_usage());
//这时再对$a做修改,$a必然与$b值相同,因为指向了同一块内存空间
$a = range(0,1000);
var_dump(memory_get_usage());

2.zval变量容器

$a = range(0,3);
//需要安装xdebug拓展
xdebug_debug_zval('a');
/**
*输出为:
*a:(refcount=1,is_ref=0)=array()
*/
//refcount=1 1个变量在指向这个空间
//is_ref=0 是不是引用,0:false
$a = range(0, 3);
xdebug_debug_zval('a');
//定义变量b,把a的值赋值给b
$b = $a;
xdebug_debug_zval('a');
/**
*输出为:
*a:(refcount=1,is_ref=0)=array()
*a:(refcount=2,is_ref=0)=array()refcount=2因为$a与$b都指向这个空间
*/
$a = range(0, 3);
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('a');
//修改a
$a = range(0, 3)
xdebug_debug_zval('a');
/**
*输出为:
*a:(refcount=1,is_ref=0)=array()
*a:(refcount=2,is_ref=0)=array()
*a:(refcount=1,is_ref=0)=array()refcount=1因为$a进行了写操作,不再指向该空间,复制了一份指向新空间
*/
$a = range(0, 3);
xdebug_debug_zval('a');
$b = &$a;
xdebug_debug_zval('a');
$a = range(0, 3)
xdebug_debug_zval('a');
/**
*输出为:
*a:(refcount=1,is_ref=0)=array()$a指向该空间
*a:(refcount=2,is_ref=1)=array()$a,$b指向该空间,引用变为true
*a:(refcount=2,is_ref=1)=array()$a,$b指向该空间,引用变为true
*/

3.注意点

//unset只会取消引用,不会销毁空间
$a = 1;
$b = &$a;
unset($b);
echo $a;//1 只取消掉$b的引用,未销毁空间,$a还是指向该空间
//对象本身就是引用传递
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=2,is_ref=0)='zhangsan'}
*p1:(refcount=2,is_ref=0)=class Person{public $name=(refcount=2,is_ref=0)='zhangsan'}
*p1:(refcount=2,is_ref=0)=class Person{public $name=(refcount=1,is_ref=0)='lisi'}//对象不会对空间进行复制
*/

EX

ex1:
<?php
$data = ['a','b','c'];
foreach ($data as $key => $val) {
  $val = &data[$key];
}
问:每次循环$data值与执行结束$data值?
1.
$k = 0
$v = a//新空间a
$v = $d[0]//新空间$d[0],同时$v也指向这块空间
2.
$k = 1
$v = b//空间$d[0]值从a变为b
$v = $d[1]//新空间$d[1],同时$v也指向这块空间
3.
$k = 2
$v = c
d[1] = c//空间d[1]值从b变为c
$v = $d[2]//新空间$d[2],同时$v也指向这块空间

[a,b,c]
[b,b,c]
[b,c,c]
ex2:
<?php
$arr = [['price'=>10, 'count' => 100],['price' =>20, 'count' => 90]];
foreach ($arr as &$val) {
    $val['total']=$val['price']*$val['count'];
}
print_r($arr);
/**
* 
*Array
*(
*    [0] => Array
*        (
*            [price] => 10
*            [count] => 100
*            [total] => 1000
*        )
*
*    [1] => Array
*        (
*            [price] => 20
*            [count] => 90
*            [total] => 1800
*        )
*
*)
*
*/
//等效于:
foreach($arr as $k => $val) {
  $arr[$k]['total'] = $val['price']*$val['count'];
}

相关文章

  • PHP-引用变量

    1.&引用变量 2.zval变量容器 3.注意点 EX ex1: ex2:

  • 第3章 PHP变量

    PHP-什么是变量 变量是用于存储值的 PHP-如何定义变量 定义变量就是向服务器的内存(服务器的内存,我们可以当...

  • PHP-变量

    基本变量 $开头,紧跟一个字母或者下划线,之后再跟不限数量的字母、数字、下划线;正则表达为: 最好初始化变量,未初...

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

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

  • php入门知识点

    1、PHP-变量名的命名规则 2、通过使用“memory_get_usage”获取当前PHP消耗的内存 3、var...

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

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

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

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

  • php基础知识面试点

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

  • PHP之-基础知识考查

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

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

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

网友评论

      本文标题:PHP-引用变量

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