php面试专题---1、php中变量存储及引用的原理

一、总结

一句话总结:

查看变量的存储结构可以安装xdebug扩展,用xdebug_debug_zval()方法,不推荐使用memory_get_usage()方法

1、php中memory_get_usage()方法的作用是什么?

返回分配给 PHP 的内存量

2、什么是引用变量?在PHP当中,用什么符号定义引用变量??

用不同的名字访问同一个变量内容:在PHP中引用意味着用不同的名字访问同一个变量内容。
使用&符号

3、php变量存储机制代码实例的 注意?

|||-begin

//定义一个变量
$a=range(0,1000);
var_dump(memory_get_usage());//定义变量b,将a变量的值赋值给b
//cow Copy On Write
Sb=$a;
var_dump(memory_get_usage());//对a进行修改
Sa=range(e,1000);
var_dump(memory_get_usage());结果
int(369184)
int(369224) //和上一个很接近
int(513728)

|||-end

cow:Copy On Write:当Sb=$a时,Sb和$a共用一块存储空间,直到重新对$a进行写操作,虽然值是一样的,但是已经指向了不同的区域
memory_get_usage():返回分配给 PHP 的内存量
当Sb=&$a;时,$a和$b永远指向同一空间

4、xdebug扩展打印变量结构实例 注意?

//zval变量容器
$a=range(e,3);
xdebug_debug_zval('a');a:(refcount=1,is_ref=0)=array(0=>
(refcount=1,is_ref=0)=0,1=>(refcount=
1,is_ref=0)=1,2=>(refcount=1,is_ref=
0)=2,3=>(refcount=1,is_ref=0)=3)

refcount表示的是指向这个空间的变量:比如Sb=$a之后,这样$a的refcount是2,如果$a修改之后,$a和$b的refcount都是1
is_ref表示是否被引用:比如Sb=&$a之后,这样$a的refcount是2,is_ref是1,$b的也是一样的

5、unset的作用是什么,unset会销毁内存空间么?

|||-begin

<?php
// unset 只会取消引用,不会销毁空间
$a = 1;
$b = &$a;
unset($b);
echo $a. "\n"; //结果还是1

|||-end

unset 只会取消引用,不会销毁空间

6、php中的对象赋值是引用么,还是如普通变量那样copy on write?

|||-begin

<?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');

|||-end

对象本身就是引用传递,但是$p2 = $p1方式两者指向同一空间(就算其中一个修改值),但是is_ref(引用)变量还是0

7、下列程序的结果是多少,为什么?

|||-begin

<?php/*** 写出如下程序的输出结果* <?php** $data = ['a', 'b', 'c'];** foreach($data as $key => $val)* {*      $val = &$data[$key];* }* 程序运行时,每一次循环结束后变量$data的值是什么?请解释* 程序执行完成后,变量$data的值是什么?请解释*/$data = ['a', 'b', 'c'];foreach ($data as $key=>$val)
{$val = &$data[$key];var_dump($data);
}var_dump($data);

|||-end

[a,b,c],[b,b,c],[b,c,c],[b,c,c]
画图分析:$val = &$data[$key]; 表示将$data[$key]的地址给了$val

二、内容在总结中

转载于:https://www.cnblogs.com/Renyi-Fan/p/11058450.html

php面试专题---1、php中变量存储及引用的原理相关推荐

  1. python中变量的地址引用和拷贝

    python中变量的地址引用和拷贝 最近在自学python,看官方文档的时候被copy弄懵了,所以恶补了一下关于变量到底是怎么回事的知识,总结一下自己思考和参考其他文章的内容,此篇作为备忘录(岁数大了 ...

  2. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  3. C语言中变量存储类别——自动变量,寄存器变量,静态外部链接;

    c提供了多种不同模型或存储类别在内存中存储数据. 作用域: 作用域描述程序中可访问标识符的区域. 作用域描述了程序中可以访问一个标识符的一个或多个区域.即变量的可见性. 一个变量的作用域可以是代码块作 ...

  4. php 变量源码,PHP源码中变量存储方式

    PHP是动态类型语言,是使用静态类型的C语言编写的.PHP的类型系统是Zend引擎实现的. 在Zend/zend.h文件中,有如下代码,定义了一些结构体: typedef union _zvalue_ ...

  5. 关于JS中变量提升的规则和原理的一点理解(一)

        关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...

  6. JavaScript中变量的相互引用

    http://www.jb51.net/article/23387.htm 转载于:https://www.cnblogs.com/chris-oil/p/3402072.html

  7. Java中值传递和引用传递原理以及区别

    Java在参数传递时有两种:一种是按值传递,一种是按引用传递 值传递:值传递是指在调用方法时将实际参数复制一份传递到方法中,也就是说,在调用方法时,实际参数把他的值的副本传递给对应的形式参数.(注意这 ...

  8. php变量有三种不同的作用域,PHP中变量类型与转换,变量的检测以及变量的作用域学习--2018年4月13日12时03分...

    今天主要讲述了变量类型与转换,变量的检测,变量的作用域. 一.变量的类型与转换 在PHP中有八种变量类型,分别是: 标量中的整形(int),浮点型(float),字符串(string),布尔型(boo ...

  9. 面试宝典系列-PHP变量在内存中的存储方式

    为什么80%的码农都做不了架构师?>>>    函数传参时是赋值操作,只是其存储在不同的符号表(函数符号表),并且引用计数加2,而不是加1.原因是函数栈也包含了这个变量容器的引用. ...

  10. python变量存储 堆与栈内存内存_浅析JS中的堆内存与栈内存

    最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.const的区别 A:balabalabalabla... Q:const定义的值能改么? A:你逗我?不能吧 不知道各位看官怎么想? ...

最新文章

  1. Debug Assertion Failed!
  2. 【转】名企献身说法:我们喜欢这样的简历
  3. 【DP】划分数列(ybtoj DP-2-1)
  4. 安卓页面去掉顶部标题
  5. SPASVO 软件生命周期管理 ALM V2.1 正式发布!
  6. linux文件压缩包,linux目录文件压缩包操作
  7. backbone入门系列(4)集合
  8. token怎么获取 php,如何用php获取某个页面中的input的csrf_token?
  9. inittab 分析
  10. android tabhost 跳转,TabHost中跳转到指定Tab页问题
  11. 从程序员到项目经理:原来一切问题都是可以解决的
  12. ubuntu wine 使用
  13. OSChina 周六乱弹 ——致敬默默守护国运的男人们
  14. 【强化学习】实现Atari游戏的自动化学习(仅供参考)
  15. 服装企业在实践中探索
  16. UI设计要学习哪些软件
  17. python3 文字合成语音MP3
  18. matlab的输入输出
  19. IPad上windows远程桌面软件推荐
  20. 2017下半年掘金日报优质文章合集:Android篇,android开发工程师

热门文章

  1. 垃圾回收相关算法总结
  2. spring源码 第二个后置处理器方法的使用-推断构造函数
  3. c# 循环com,分别对串口写入与读取,获取需要的串口信息
  4. Python3 CookBook | 数据结构和算法(一)
  5. 好东西再安利一遍!!
  6. 从陪练到赢家:人机博弈的六十年
  7. phpstudy配置ssl
  8. Cannot delete or update a parent row: a foreign key constraint fails
  9. 挑netfilter的11个不足之处
  10. 积木赛尔号机器人_【点映观影】赛尔号大电影7:疯狂机器城赛尔宇宙探险迎人类首秀...