引用变量 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# 画布验证码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 利用谷歌网站的翻译网站,实现谷歌翻译api
代码是之前网上找到的,地址为:http://www.crifan.com/teach_you_how_to_find_free_google_translate_api/ 原先的代码有不足,如果翻译里 ...
- 元类实现ORM
1. ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. ...
- linux下ftp服务器搭建
1.yum install vsftpd 使用yum安装ftp 2.创建并授权ftp文件目录 mkdir -P /ftp/ftpadmin chmod -R 777 /ftp/ftp ...
- Aurelia binding
今天介绍一下使用Aurelia binding 模块绑定HTML属性/事件的方式.我们依然使用之前创建的代码例子. Aurelia binding 绑定属性或者方法的通用模式就是 XXX.comman ...
- js 位运算符
MDN定义:位运算符将它的操作数视为32位元的二进制串(0和1组成)而非十进制八进制或十六进制数. 例如:十进制数字9用二进制表示为1001,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准 ...
- js 正则表达式之环视结构
一.环视 1:环视不“占用”字符,只匹配字符所在的特定位置. 2:正则表达式是从左向右进行匹配的. 二.肯定顺序环视(?=....) 子表达式匹配当前位置的右侧字符 图中:红色表示当前位置,绿色表示正 ...
- angular 动态取到的html片段 在页面的展示
写个过滤器 xxx.filter( 'to_trusted', ['$sce', function ($sce) { return function (text) { return $sce.trus ...
- Python importlib 动态加载模块
# 创建一个 src 文件夹,里面有一个 commons.py 文件,内容如下 def add(): print("add ....") # 创建一个 app.py 文件,内容如下 ...
- angularJS解决数据显示闪一下的问题?-解决办法
转自:https://www.cnblogs.com/e0yu/p/7219930.html?utm_source=itdadao&utm_medium=referral#undefined ...