美文网首页
PHP——2(PHP变量作用域)

PHP——2(PHP变量作用域)

作者: iscona | 来源:发表于2017-12-04 18:07 被阅读0次

    PHP——2(PHP变量作用域)
    PHP——3(PHP变量分离/引用(Variables Separation))
    为辅助阅读,可直接跳过

    在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table), 并且,PHP也是通过不同的数组来实现变量的作用域的。

    当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的变量值,然后将这个变量的名字,和指向这个zval的指针填入一个数组中。然后,当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval。

    查看_zend_executor_globals结构(这个结构在PHP的执行器保存一些执行相关的上下文信息)

    struct _zend_executor_globals { 
         ....
        HashTable *active_symbol_table;/*活动符号表*/
        HashTable symbol_table;     /*全局符号表*/
     
        HashTable included_files;   
     
        jmp_buf *bailout;
        int error_reporting;
         .....
    }
    

    其中,全局符号表,保存了在顶层作用域(就是不在任何函数,对象内)的变量。每当调用一个函数(对象的方法)的时候,就会为这个函数创建一个活动符号表,所有在这个函数内定义的变量,都会保存在这个活动符号表中。

    对,这就是PHP的变量作用域的实现方式! 举个列子:

    <?php
         $var = "I am in the global symbol table";
        function sample($para){
            $var = "I am in the active symbol table";
              echo $var;
          }
        sample($var);
        echo $var;
      ?>
    

    在函数sample外面的变量$var,它会被填入全局符号表中,与他对应的有一个zval指针,这个zval保存了一个字符串”I am in the global symbol table”.
    函数内的$var, 它会被填入属于函数sample的活动符号表中,一样的,与他对应的zval中,保存着字符串”I am in the active symbol table“.
    比较特殊的,就是函数sample的参数$para了,这个$para是保存在sample的活动符号表的,但是与他对应的zval指针,会指向一个保存一份全局变量$var的copy的zval(严格来讲不是copy,是引用,这个涉及到变量的copy on write机制,我会在以后介绍)。

    我们都知道PHP对于简单变量是传值调用的,但是,我要告诉你的是,PHP并不是简单的通过复制一个zval来实现传值的.

    相关文章

      网友评论

          本文标题:PHP——2(PHP变量作用域)

          本文链接:https://www.haomeiwen.com/subject/dvybhxtx.html