zoukankan      html  css  js  c++  java
  • php变量引用类型

    #摘自https://github.com/pangudashu/php7-internal/blob/master/2/zval.md

    引用是PHP中比较特殊的一种类型,它实际是指向另外一个PHP变量,对它的修改会直接改动实际指向的zval,可以简单的理解为C中的指针,在PHP中通过&操作符产生一个引用变量,也就是说不管以前的类型是什么,&首先会创建一个zend_reference结构,其内嵌了一个zval,这个zval的value指向原来zval的value(如果是布尔、整形、浮点则直接复制原来的值),然后将原zval的类型修改为IS_REFERENCE,原zval的value指向新创建的zend_reference结构。

    struct _zend_reference {
        zend_refcounted_h gc;
        zval              val;
    };

    结构非常简单,除了公共部分zend_refcounted_h外只有一个val,举个示例看下具体的结构关系:

    $a = "time:" . time();      //$a    -> zend_string_1(refcount=1)
    $b = &$a;                   //$a,$b -> zend_reference_1(refcount=2) -> zend_string_1(refcount=1)

    最终的结果如图:

    ref

    注意:引用只能通过&产生,无法通过赋值传递,比如:

    $a = "time:" . time();      //$a    -> zend_string_1(refcount=1)
    $b = &$a;                   //$a,$b -> zend_reference_1(refcount=2) -> zend_string_1(refcount=1)
    $c = $b;                    //$a,$b -> zend_reference_1(refcount=2) -> zend_string_1(refcount=2)
                                //$c    ->                                 ---

    $b = &$a这时候$a$b的类型是引用,但是$c = $b并不会直接将$b赋值给$c,而是把$b实际指向的zval赋值给$c,如果想要$c也是一个引用则需要这么操作:

    $a = "time:" . time();      //$a       -> zend_string_1(refcount=1)
    $b = &$a;                   //$a,$b    -> zend_reference_1(refcount=2) -> zend_string_1(refcount=1)
    $c = &$b;/*或$c = &$a*/     //$a,$b,$c -> zend_reference_1(refcount=3) -> zend_string_1(refcount=1) 

    这个也表示PHP中的 引用只可能有一层 ,不会出现一个引用指向另外一个引用的情况 ,也就是没有C语言中指针的指针的概念。

    ###由此可以得出php函数都是值传递

  • 相关阅读:
    IOS开发 网络发展史(NSURLProtocol)
    IOS开发 网络发展史(NSURLCach)
    IOS 开发 网络发展史(URLConnection)
    ios 网络开发(CFNetwork)
    MAC安装mysql
    conda 安装常用包
    从必应上拉取图片
    旋转数组中的二分查找
    东北大学 python模拟登录校园网(2019年6月启用新登录模式后)
    Ubuntu 安装Codeblocks
  • 原文地址:https://www.cnblogs.com/a-flydog/p/9479726.html
Copyright © 2011-2022 走看看