zoukankan      html  css  js  c++  java
  • 什么是引用变量?在PHP当中,用什么符号定义引用变量?

    PHP的引用变量的概念及定义方式

      概念:在PHP找那个引用意味着用不同的名字来访问同一个变量的内容。

      定义方式:&;使用&符号

    PHP引用变量的工作原理

    <?php
      //定义一个变量
      $a = range(0,1000);

      //定义变量b,将a变量的值赋值给b
      $b = $a;
      //由于COW机制,所以$b并没有开辟出新的内存空间,而是指向同一份内存
      
      //对$a进行修改,之前$a和$b都是指向同一个内存空间,而这个时候$a发生了改变,所以这个时候会给$a重新开辟出一个新的内存空间
      $a = range(0,1000);

    ?>
    <?php
      //定义一个变量
      $a = range(0,1000);

      //定义变量b,将a变量的值赋值给b
      $b = &$a;
      $a = range(0,1000);
      //引用的话就不会开辟新的内存空间;

    ?>


    /**
      

    写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。

    */
    <?php 
        //    zval 变量容器
        $a = range(0,3);
        xdebug_debug_zval('a');
        $b = $a;
        xdebug_debug_zval('b');
        $c = &$a;
        xdebug_debug_zval('c');
        $a = range(0,3);
        xdebug_debug_zval('a');
        xdebug_debug_zval('b');
        xdebug_debug_zval('c');
        
        
        /**
            每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,
        还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用
        集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允
        许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使
        用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个
        数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过
        浏览器请求的的脚本)和每个函数或者方法也都有作用域。
        */
    ?> 

     

     unset:释放给定的变量

    <?php 
      //unset 只会取消引用,不会销毁空间 $a
    = 1; $b = &$a; unset($b); var_dump($a);  // 1 var_dump($b);  // null ?>
    <?php 
        $a = 1;
        $b = &$a;
        unset($a);
        var_dump($a);  //  null
        var_dump($b);  // 1
    ?> 

     引用对象

        <?php
        /* 
            对象本身就是引用传递;所以他并不会开辟新的内存空间
        */
        class Person
        {
            public $name = "初雨";
        }

        $p1 = new Person;
        xdebug_debug_zval("p1");
        $p2 = $p1;
        xdebug_debug_zval("p1"); 
        xdebug_debug_zval("p2");
        $p2->name="清风"; 
        xdebug_debug_zval("p1");
        xdebug_debug_zval("p2");
        $p3 = &$p1;
        xdebug_debug_zval("p1");
        xdebug_debug_zval("p2");
        xdebug_debug_zval("p3");
        unset($p3);
        unset($p1);
        xdebug_debug_zval("p1");
        xdebug_debug_zval("p3");

        ?>

      

     

    杂念太多,必然根基浅薄
  • 相关阅读:
    Jedis测试redis
    jedis池的作用
    错误
    Ceph剖析:数据分布之CRUSH算法与一致性Hash
    drools规则引擎初探
    Techniques for HA IT Management
    django_simple_captcha使用笔记
    微服务架构的理论基础
    分布式系统服务的稳定性
    四层、七层负载均衡的区别
  • 原文地址:https://www.cnblogs.com/starshine-zhp/p/12818229.html
Copyright © 2011-2022 走看看