以下为 php 中的各种变量在底层实现中是如何存储的。
变量:
$temp = 'temp';$temp2 = $temp;// keyp *executor_globals.symbol_table.ardata[7].key.val@4p *executor_globals.symbol_table.ardata[8].key.val@4// valuep *executor_globals.symbol_table.ardata[7].val.value.zv.value.str.val@4p *executor_globals.symbol_table.ardata[8].val.value.zv.value.str.val@4$temp = 'temp';$temp2 = &$temp;// valuep *executor_globals.symbol_table.ardata[7].val.value.zv.value.ref.val.value.str.val@4p *executor_globals.symbol_table.ardata[8].val.value.zv.value.ref.val.value.str.val@4
方法:
function test(){ $temp = 'temp'; static $test = 'test';}// function namep *executor_globals.function_table.ardata[924].key.val@4// function bodyp *executor_globals.function_table.ardata[924].val.value.func// function temp variable keyp *executor_globals.function_table.ardata[924].val.value.func.op_array.vars[0].val@4// function temp variable valuep *executor_globals.function_table.ardata[924].val.value.func.op_array.literals[0].value.str.val@4// function static variable keyp *executor_globals.function_table.ardata[924].val.value.func.op_array.static_variables.ardata[0].key.val@2// function static variable valuep *executor_globals.function_table.ardata[924].val.value.func.op_array.static_variables.ardata[0].val.value.ref.val.value.str.val@4
常量:
// phpdefine('aa', 'aa');// keyp *executor_globals.zend_constants.ardata[849].key.val@2// valuep *executor_globals.zend_constants.ardata[849].val.value.zv.value.str.val@2
class:
// phpclass 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 bodyp *executor_globals.class_table.ardata[153].val.value.ce// class protetry keyp *executor_globals.class_table.ardata[153].val.value.ce.properties_info.ardata[0].key.val@2// class protetry valuep *executor_globals.class_table.ardata[153].val.value.ce.default_properties_table.value.str[0].val@6// class static protetry valuep *executor_globals.class_table.ardata[153].val.value.ce.default_static_members_table.value.str[0].val@6// class constanct namep *executor_globals.class_table.ardata[153].val.value.ce.constants_table.ardata[0].key// class constanct valuep *executor_globals.class_table.ardata[153].val.value.ce.constants_table.ardata[0].val.value.zv.value.str.val@6// class function namep *executor_globals.class_table.ardata[153].val.value.ce.function_table.ardata[0].key.val@4// class function bodyp *executor_globals.class_table.ardata[153].val.value.ce.function_table.ardata[0].val.value.func// class function temp variablep *executor_globals.class_table.ardata[153].val.value.ce.function_table.ardata[0].val.value.func.op_array.vars[0].val
以上就是php变量作用域的用法介绍(代码)的详细内容。