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
二、内容在总结中