深入理解PHP原理之变量作用域(Scope in PHP)-php教程

资源魔 43 0
3.jpg

后面的文章(深化了解PHP原理之变量(Variables inside PHP))引见了PHP变量的外部示意,然而,成绩是,这些外部示意是若何以及用户剧本中的变量联络起来的呢?也就是说,假如我正在剧本中写下:

<?php
  $var = "laruence";
  echo $var;
?>

ZE是若何把我的变量var以及外部构造zval联络起来的呢?

深化了解PHP原理之变量中讲过,PHP外部都是应用zval来示意变量的,然而关于下面的剧本,咱们的变量是着名字的, var。而zval中并无相应的字段来表现变量名。

假如你想到了PHP外部肯定有一个机制,来完成变量名到zval的映照。那末你真的是很聪慧,;)

保举学习:PHP视频教程

正在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,是援用)。

以上就是深化了解PHP原理之变量作用域(Scope in PHP)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 作用域 变量

抱歉,评论功能暂时关闭!