以下为 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. [luogu2513 HAOI2009] 逆序对数列 (计数dp)

    题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? ...

  2. [LUOGU]P3701 主席树(假的)

    有人恶意刷难度...就一个最大流模板... 但是题面吼啊2333 #include <iostream> #include <cstdio> #include <queu ...

  3. 笔记本安装Archlinux笔记

    同步更新于wendster大佬的个人博客 搬运自我的洛谷博客 可能会不定期更新! 因为前几天给我的小炸鸡加了一根内存条:而且先前装的Xubuntu是32位的,使用极其不方便:再加上wendster大佬 ...

  4. Vue的数据依赖实现原理简析

    首先让我们从最简单的一个实例Vue入手: const app = new Vue({ // options 传入一个选项obj.这个obj即对于这个vue实例的初始化 }) 通过查阅文档,我们可以知道 ...

  5. STM32 HAL库 IIC 协议库函数

    /* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超 ...

  6. jenkins 安装遇到的坑

                        最后启用安全的时候遇到一点坑,直接写了一个用户上去,没有勾选权限,然后在登录就说没有 overright/等,然后需要修改配置文件conf.xml 在主目录下. ...

  7. HDU 4240 Route Redundancy

    Route Redundancy Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Origin ...

  8. 基于nginx的静态网页部署

    背景: 一序列的html网页需要部署 基于nginx的部署: 本文采用的基于openresty的nginx 配置. 简单地配置 Nginx 的配置文件,以便在启动 Nginx 时去启用这些配置即可实现 ...

  9. java语言MySQL批处理

    本质来讲就是使用Statement和PreStatement的addBatch()方法 代码 import java.sql.*; public class GetConnection{ public ...

  10. java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】

    DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...