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

本文详细解读PHP变量存储机制,包括memory_get_usage()、引用变量的定义与使用、CopyOnWrite原理、xdebug_debug_zval()探查变量结构、unset操作和对象赋值特性。通过实例和分析,揭示变量引用计数和内存管理的秘密。
摘要由CSDN通过智能技术生成

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

$a = 1;$b = &$a;unset($b);echo $a. "\n"; //结果还是1

|||-end

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

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

|||-begin

classPerson

{public $name = "zhangsan";

}$p1 = newPerson;

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

*

* $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

二、内容在总结中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值