摘要:以下为中的各种变量在底层实现中是如何存储的。变量方法常量类名保存在的时候的是不区分大小写的,但是类名字本身在中还是有大小写的小写保持原样
以下为 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://www.ucloud.cn/yun/29543.html
摘要:在编写一段析构方法的研究代码中,我遇到了交叉知识点导致的错误在不同作用域,析构方法与引用次数导致了不一样的结果。前提本文假装你已经明白什么是析构方法作用域及引用次数。当析构函数的调用钩子去检测引用数时,全局的实例自然无法触发这个事件。 在编写一段析构方法的研究代码中,我遇到了交叉知识点导致的错误——在不同作用域,析构方法与引用次数导致了不一样的结果。 前提 本文假装你已经明白什么是析构...
摘要:小驼峰法大驼峰法匈牙利命名法变量名属性类型对象描述。是一种弱类型语言,变量在使用之前并不需要声明类型,且同一变量可以保存多种不同类型的数据。另外,在函数内部创建的静态变量是无法在函数外部使用的。 变量标识符 标识符即是变量的名称,PHP 中关于变量的标识符有以下规则: 由任意字母、数字、下划线组成,但不能以数字开头 严格区分大小写 为了科学规范标识符,主要有以下几种流行的命名方式:...
摘要:每种程序语言都有自己的作用域实现,的作用域是怎么实现的呢先看一段代码。那在底层是怎么实现这样的效果的引擎本身有结构,该结构中的是全局符号表,其中保存了顶层作用域的变量也就是全局变量。那局部变量呢其实每个函数都有一个自己的符号表。 每种程序语言都有自己的作用域实现,php的作用域是怎么实现的呢? 先看一段php代码。 $bar = out; function scope(){ ...
摘要:以上结果会输出那么可以看到被作为了变量通过传递给了匿名函数作为参数使用如果去掉的注释,那么以上结果会输出将上面的函数改写为以上结果会输出说明在中第二次为赋值的时候,并没有传递的到函数里面去。 在项目中,难免会遇到闭包的形式,那么在闭包中,变量的作用域到底是怎么样的呢。下面有几个简单的例子。 e1 function test_1() { $a = php; $func...
摘要:作用域是指在一个脚本中某个变量可以使用或可见的范围。具有项基本的作用域规则内置超级全局变量可以在脚本的任何地方使用和可见。在一个脚本中声明的全局变量在整个脚本中是可见的,函数内部除外。 作用域是指在一个脚本中某个变量可以使用或可见的范围。 php具有6项基本的作用域规则: 内置超级全局变量可以在脚本的任何地方使用和可见。 常量,一旦被声明,将可以在全局可见;也就是说,它们可以在函数...
摘要:和函数几乎是相同的,二者的区别在于函数失败后,函数将给出一个致命错误,而函数只是给出一个警告。关键字将终止函数的执行。很多情况下,递归可以取代循环,但是递归函数比循环慢而且要占用更多内存。 笔记内容来源于《PHP和MySql Web开发》 一,代码重用的好处:1.可以降低成本;2.增加代码的可靠性;3.提高他们的一致性。 二,使用require()和include()函数:1.使用一条...
阅读 2194·2021-11-11 16:54
阅读 2247·2019-08-30 15:55
阅读 3744·2019-08-30 15:54
阅读 531·2019-08-30 15:44
阅读 2365·2019-08-30 10:58
阅读 557·2019-08-26 10:30
阅读 3180·2019-08-23 14:46
阅读 3395·2019-08-23 13:46