引用变量 php面试总结1
(1)PHP引用变量
概念:不同的变量名,访问同一个变量内容,使用&
知识点:
使用php函数
(a)memory_get_usage() 查看内存使用情况
eg
// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());
运行结果
(b)xdebug_debug_zval() zval变量容器
eg
// zval变量容器
$a = range(0, 3);
xdebug_debug_zval('a');
运行结果
refcount指在这个空间的变量有1个 is_ref指是否为引用变量 0为不是引用变量,1为是引用变量
(c) unset 只会取消引用,不会销毁空间
eg
<?php // unset 只会取消引用,不会销毁空间
$a = 1; $b = &$a; unset($b); echo $a. "\n";
运行结果
过程
(d)对象不会进行空间的复制,对象本身就是引用传递(要复制需要clone,相关链接https://blog.csdn.net/sinat_29091823/article/details/72637192)
eg
<?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');
运行结果已经过程
使用PHP引用变量前 eg:
<?php // 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage()); // 定义变量b,将a变量的值赋值给b
// COW Copy On Write
$b = $a;
var_dump(memory_get_usage()); // 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
运行结果
过程图
使用PHP引用变量后 eg:
<?php // 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage()); // 定义变量b,将a变量的值赋值给b
$b = &$a;
var_dump(memory_get_usage()); // 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
运行结果
过程图
面试题
<?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);
引用变量 php面试总结1的更多相关文章
- PHP面试 PHP基础知识 一(引用变量)
PHP引用变量 常见引用变量面试题: 什么是引用变量? 在PHP中用什么符号定义引用变量? 考点:PHP的引用变量的概念及定义方式 概念:在PHP中引用意味着用不用的名字访问同一个变量内容 定 ...
- Java基础-被final修饰的引用变量的指向
final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子: public class Test { public static void ...
- PHP GC垃圾回收机制之引用变量回收周期疑问
普通的引用变量的销毁大家都知道, 当unset的时候如果refcount = 0 则认为无用, 销毁. 但是手册中提到一点会有递归引用的问题,很是奇葩 代码如下 <?php $a = 1; $a ...
- C++引用变量(转)
引用变量 c++中引用变量的使用: 定义: int rate=80; int & pt=rate 1.pt 是引用变量,申明引用变量时必须将其初始化.pt 和rate 的值指向相同的内存变量 ...
- c#问答篇:对象与引用变量-----初学者的困惑
转自:http://www.cnblogs.com/huangyu/archive/2004/08/02/29622.html 从宏观的角度来看,对象是类的实例.比如: //定义一个名为Someone ...
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
- C++引用变量学习
版权所有,转载请注明来源 (1)reference variable(rv) 主要用处是作为方程的形式参数,使用rv 可以直接对原数据进行操作而不是该数据的拷贝,节省了时间和空间,尤其是对于结构体以及 ...
- C++学习笔记29,引用变量(1)
引用变量在创建的时候就必须初始化.无法创建一个未被初始化的引用. #include <iostream> using namespace std; int main() { int x=1 ...
- [DB][mybatis]MyBatis mapper文件引用变量#{}与${}差异
MyBatis mapper文件引用变量#{}与${}差异 默认,使用#{}语法,MyBatis会产生PreparedStatement中.而且安全的设置PreparedStatement參数,这个过 ...
随机推荐
- C#基础知识总结(四)
摘要 循环结构的总结.跳转语句(break.continue).调试程序 一.循环结构的总结 1.while循环 ; ) { Console.WriteLine(i); i++; } 2.do-whi ...
- 详解MySQL基准测试和sysbench工具(转)
前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...
- Spring Boot 2.0 升级指南
Spring Boot 2.0 升级指南 前言 Spring Boot已经发布2.0有5个月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把项目中Spring Boot 版本做了升级,顺便整理下 ...
- 【Mysql】常用命令
登录mysql -uroot -p 查看有哪些数据库show databases; 创建一个普通用户 sa ,密码是 some_passCREATE USER 'sa'@'%' IDENTIFIED ...
- Http协议请求头、响应头、响应码
Http部分请求头 Accept 客户机通过这个头,告诉服务器,它支持哪些数据类型 Accept-Charset 客户机通过这个头,告诉服务器,它支持的编码 Accept-Encoding 客户机通过 ...
- 6;XHTML 超链接
1.超链接的基本格式 2.超链接的种类 3.相对链接和绝对链接 4.书签的链接 5.基准参考点 6.超链接事件 7.为链接创建键盘快捷键 8.为链接设置制表符次序 超链接也叫 URL 中文翻译为资源定 ...
- elementUI vue v-model的修饰符
v-model的修饰符 v-model.lazy 只有在input输入框发生一个blur时才触发 v-model.trim 将用户输入的前后的空格去掉 v-model.number 将用户输入的字符串 ...
- loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...
- 「Android」 Surface分析
本篇针对Surface模块进行分析,从Java层的Activity创建开始,到ViewRoot.WindowsManagerService,再到JNI层和Native层. 首先推荐一个Android源 ...
- git 入门教程之基本概念
基本概念 了解工作区,暂存区和版本库的区别和联系有助于我们更好理解 git 的工作流程,了解命令的操作意图. git 和其他版本控制系统如 svn 的不同之处就是有暂存区的概念. 基本概念 工作区 | ...