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. " "; //结果还是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