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

    二、内容在总结中

     
  • 相关阅读:
    C语言面试题——大小端测试(一)
    C语言面试题——联合体测cpu的大小端
    C语言面试题——sizeof的注意点
    C语言面试题——联合体测cpu的大小端
    C语言面试题——指针运算
    poj2183
    poj1972
    poj2014
    poj1970
    poj1918
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11058450.html
Copyright © 2020-2023  润新知