以下为 PHP 中的各种变量在底层实现中是如何存储的。

变量:

$temp = 'temp';
$temp2 = $temp; // key
p *executor_globals.symbol_table.arData[7].key.val@4
p *executor_globals.symbol_table.arData[8].key.val@4 // value
p *executor_globals.symbol_table.arData[7].val.value.zv.value.str.val@4
p *executor_globals.symbol_table.arData[8].val.value.zv.value.str.val@4 $temp = 'temp';
$temp2 = &$temp; // value
p *executor_globals.symbol_table.arData[7].val.value.zv.value.ref.val.value.str.val@4
p *executor_globals.symbol_table.arData[8].val.value.zv.value.ref.val.value.str.val@4

方法:

function test(){
$temp = 'temp';
static $test = 'test';
} // function name
p *executor_globals.function_table.arData[924].key.val@4 // function body
p *executor_globals.function_table.arData[924].val.value.func // function temp variable key
p *executor_globals.function_table.arData[924].val.value.func.op_array.vars[0].val@4 // function temp variable value
p *executor_globals.function_table.arData[924].val.value.func.op_array.literals[0].value.str.val@4 // function static variable key
p *executor_globals.function_table.arData[924].val.value.func.op_array.static_variables.arData[0].key.val@2 // function static variable value
p *executor_globals.function_table.arData[924].val.value.func.op_array.static_variables.arData[0].val.value.ref.val.value.str.val@4

常量:

// php
define('AA', 'aa'); // key
p *executor_globals.zend_constants.arData[849].key.val@2 // value
p *executor_globals.zend_constants.arData[849].val.value.zv.value.str.val@2

class:

// php
class Apple{
public $a = 'avalue';
public $a2 = 'avalue';
public static $b = 'bvalue';
public static $b2 = 'bvalue';
const E = 'evalue';
const F = 'fvalue'; public function test(){
  $c = 'cvalue';
  vr_dump($this->a, $c);
}
 
public static function test2(){
  $d = 'dvalue';
  vr_dump(self::$b, $d);
}
}
$obj = new Apple();
$obj->test();
Apple::test2(); // class name 类名保存在class_table的时候的 key 是不区分大小写的,但是类名字本身在 class_entry 中还是有大小写的
p *executor_globals.class_table.arData[153].key.val@5 // 小写
p *executor_globals.class_table.arData[153].val.value.ce.name.val@5 // 保持原样 // class body
p *executor_globals.class_table.arData[153].val.value.ce // class protetry key
p *executor_globals.class_table.arData[153].val.value.ce.properties_info.arData[0].key.val@2 // class protetry value
p *executor_globals.class_table.arData[153].val.value.ce.default_properties_table.value.str[0].val@6 // class static protetry value
p *executor_globals.class_table.arData[153].val.value.ce.default_static_members_table.value.str[0].val@6 // class constanct name
p *executor_globals.class_table.arData[153].val.value.ce.constants_table.arData[0].key // class constanct value
p *executor_globals.class_table.arData[153].val.value.ce.constants_table.arData[0].val.value.zv.value.str.val@6 // class function name
p *executor_globals.class_table.arData[153].val.value.ce.function_table.arData[0].key.val@4 // class function body
p *executor_globals.class_table.arData[153].val.value.ce.function_table.arData[0].val.value.func // class function temp variable
p *executor_globals.class_table.arData[153].val.value.ce.function_table.arData[0].val.value.func.op_array.vars[0].val

原文地址:https://segmentfault.com/a/1190000016705359

PHP 变量作用域的更多相关文章

  1. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  2. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  3. Java基础知识笔记(七:接口、变量作用域和参数传递)

    一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格 ...

  4. PHP常量、变量作用域详解(一)

    PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...

  5. PHP变量作用域详解(二)

    学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...

  6. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  7. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  8. 变量作用域&函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  9. OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...

  10. python的变量作用域问题

    偶然掉进了一个坑里.仔细分析了下原因.原来是变量作用域的问题.简单抽象如下: id=1 #许多行代码 [id for id in range(10)] #许多行代码 if id!=1: #做一些事情 ...

随机推荐

  1. Java通过UUID随机生成36位、32位唯一识别码(唯一字符串)

    import java.util.UUID; /** * 通过UUID随机生成36位.32位唯一识别码(唯一字符串) * @author [J.H] * */ public class Test { ...

  2. Django中模块的加载原理

    Django中的module的加载是通过反射来完成的,借助importlib中的import_module函数来实现的动态加载.import_module的内部通过使用了递归和线程锁,字符串的切割,实 ...

  3. 基础——(5)D Flip-Flop(D触发器)

    之前搞了一个 D-Latch,看一下下图是怎么变化的 In D-latch anytime its enabled the input D is going to be output at Q 使用c ...

  4. CGI与ISAPI的区别(转)

    一 CGI原理及其性能 1) CGI概念CGI即通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的交互,通俗的讲CGI就象是一座 ...

  5. ArchLinux出现ACPI ERROR的解决方法

    ArchLinux关机.重启时出现ACPI错误: ACPI Error:Method parse/execution failed \_SB.PCI0.PGON,AE_AML_LOOP_TIMEOUT ...

  6. Layui表格编辑【不依赖Layui的动态table加载】

    依赖jquer,layui/css <td class="My_edit"></td> Jquery代码 //-----[Layui表格编辑(<td ...

  7. 一个学习scrapy的网站

    当然是scrapy中文网辣,从浅到深,例子报错几乎都有 http://www.scrapyd.cn/doc/

  8. android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题

    联系人(Contacts)中,在超大字体下.加入至联系人界面 (ConfirmAddDetailActivity)上有字母显示不全,如"j"等 这是android布局比較紧凑引起的 ...

  9. 《深入理解Android 卷III》第五章 深入理解Android输入系统

    <深入理解Android 卷III>即将公布.作者是张大伟.此书填补了深入理解Android Framework卷中的一个主要空白.即Android Framework中和UI相关的部分. ...

  10. 【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素

    //旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1, ...