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

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来实现传值的.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 语 句 功 能 数据操作 SELECT——从数据库表中检索数据行和列INSERT——向数据库表添加新数据行DELE...
    戰敭阅读 10,522评论 0 53
  • 一直在找写作的意义,所以有了自己公众号(不停的越过山丘)上面前几天写的一篇文章《你以为的写作是什么呢》除了参考几个...
    来是春初阅读 1,594评论 0 0
  • 九十年前,陈老的父母是华侨,兄弟姐妹都寄养在邻居家!父母会汇很多钱给邻居!邻居本来很穷,因为带孩子,有钱买了很多地...
    第六子阅读 1,477评论 1 1
  • hi ugj
    salvationI阅读 1,715评论 0 0
  • Origin Content Lesson 43 Over the South Pole 飞越南极 In 1929...
    愿景力阅读 3,247评论 0 0

友情链接更多精彩内容