php面试专题---1、php中变量存储及引用的原理
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
二、内容在总结中
php面试专题---1、php中变量存储及引用的原理的更多相关文章
- java 中变量存储位置的区别
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字 ...
- (转)java 中变量存储位置总结
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...
- java中变量命名和引用变量的一个坑
这次有两个主题,第一个太简单啦,就是java中变量的命名规则,纯记忆性东西.第二个主题,就是讨论一下对象引用变量的一个注意点.
- JavaScript 之 数据在内存中的存储和引用
栈和堆 大家都知道,JS中的数据类型包括两种:简单数据类型(String.Number.Boolean.undefined.null)和复杂数据类型(object). 在内存中分为栈区(stack)和 ...
- 关于JS中变量提升的规则和原理的一点理解
关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...
- 关于JS中变量提升的规则和原理的一点理解(二)
上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...
- PHP 中变量的间接引用
请看以下代码: <?php $name="Yshy"; $$name="Yanshiying"; echo $Yshy; ?> 在浏览器端将会输出: ...
- JavaScript中变量的相互引用
http://www.jb51.net/article/23387.htm
- JavaScript中变量的LHS引述和RHS引用
JavaScript中变量的LHS引述和RHS引用 www.MyException.Cn 网友分享于:2015-02-04 浏览:0次 JavaScript中变量的LHS引用和RHS引用 在Jav ...
随机推荐
- github编程类书籍
https://github.com/justjavac/free-programming-books-zh_CN
- maven 配置阿里云中央仓库
一.修改maven根目录下的conf文件夹中的setting.xml文件 <mirror> <id>alimaven</id> <name>aliyun ...
- vmware linux root密码破解
centOS: 1.开机过程按上下箭头键,让系统不要进入到引导程序中, 2.按 'e' 进入到编辑模式 3.找到linux16开始的首行,在末尾加入'rw init=/bin/sh' (会出现修改密码 ...
- go web编程——自定义路由设计
本文主要讲解go语言web编程中自定义路由器的设计.在此之前需要先了解一下go语言web编程中路由与http服务的基本原理,可以参考笔者另一篇博文:go web编程——路由与http服务 . 我们已经 ...
- 上传.cgi在252板子上跑
1.windows下写好.c程序 2.进入linux,准备交叉编译 arm-hisiv600-linux-gcc -g -Wall -o xxx.cgi xxx.c(交叉编译工具取决于板子) 3.把. ...
- tensorflow创建cnn网络进行中文手写文字识别
数据集下载地址:http://www.nlpr.ia.ac.cn/databases/handwriting/download.html chinese_write_detection.py # -* ...
- Redis在windows下的环境搭建
Redis在windows下的环境搭建 下载windows版本redis,,官方下载地址:http://redis.io/download, 不过官方没有Windows版本,官网只提供linux版本的 ...
- 自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)
1.使该Task继承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; ...
- 【记录】微信emoji表情存入数据库
最近遇到一个问题,在微信授权获取用户信息的时候,由于微信昵称(nickName)是表情,无法存入数据库. 查其原因,原来是因为数据库的编码格式不正确,我的是utf-8 改成utf8mb4就可以了. 其 ...
- 《Redis深度历险:核心原理和应用实践》学习笔记一
1.redis五种数据结构 1.1 String字符串类型,对应java字符串类型 用户信息序列化后,可以用string类型存入redis中批量读写string类型,见效网络消耗数字类型的string ...