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

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=$avar_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. "\n"; //结果还是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

[a,b,c],[b,b,c],[b,c,c],[b,c,c]
画图分析:$val = &$data[$key]; 表示将$data[$key]的地址给了$val

二、内容在总结中

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/11058450.html

猜你喜欢

转载自blog.csdn.net/weixin_34050519/article/details/93572352