博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php变量引用和计数_refcount_gc和is_ref_gc
阅读量:2428 次
发布时间:2019-05-10

本文共 1736 字,大约阅读时间需要 5 分钟。

建议读者先看下这边文章

接下来我会从源码的角度来观察这些现象

看一段简单的代码

然后查到赋值对应的opcode是 ZEND_ASSIGN_SPEC_CV_CONST_HANDLER,在zend_vm_execute.h中找到对应的实现

static int ZEND_FASTCALL  ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS){	USE_OPLINE	zval *value;	zval **variable_ptr_ptr;	SAVE_OPLINE();	value = opline->op2.zv;	variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);	if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {		if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_CONST TSRMLS_CC)) {			if (RETURN_VALUE_USED(opline)) {				zval *retval;				ALLOC_ZVAL(retval);				ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);				INIT_PZVAL(retval);				EX_T(opline->result.var).var.ptr = retval;			}		} else if (RETURN_VALUE_USED(opline)) {			PZVAL_LOCK(&EG(uninitialized_zval));			EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);		}	} else if (IS_CV == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {		if (0) {			zval_dtor(value);		}		if (RETURN_VALUE_USED(opline)) {			PZVAL_LOCK(&EG(uninitialized_zval));			EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);		}	} else {		if (IS_CONST == IS_TMP_VAR) {		 	value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);		} else if (IS_CONST == IS_CONST) {		 	value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);		} else {		 	value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);		}		if (RETURN_VALUE_USED(opline)) {			PZVAL_LOCK(value);			EX_T(opline->result.var).var.ptr = value;		}	}	/* zend_assign_to_variable() always takes care of op2, never free it! */	CHECK_EXCEPTION();	ZEND_VM_NEXT_OPCODE();}

转载地址:http://pksmb.baihongyu.com/

你可能感兴趣的文章
秋招面试准备-数据库知识
查看>>
数据分析岗-机器学习相关知识
查看>>
2018研究生数学建模心路历程
查看>>
分类模型的效果评估
查看>>
深入理解什么是Java双亲委派模型
查看>>
CentOS搭建MySQL主从环境详细过程
查看>>
Spring Boot Admin 2.3.1最新搭建到使用全攻略
查看>>
MySQL优化Limit查询语句
查看>>
轻松入门MySQL主从复制原理
查看>>
SpringCloud全家桶---Zuul网关
查看>>
基于zuul和ribbon的灰度发布方案
查看>>
JVM常用垃圾收集器参数说明
查看>>
MySQL索引基础知识梳理
查看>>
MySQL事务ACID底层实现原理
查看>>
关于MySQL wait_timeout问题记录
查看>>
基础算法面试题---如何用栈实现队列
查看>>
基础算法面试题---如何用队列实现栈(1)
查看>>
基础算法面试题---如何用队列实现栈(2)
查看>>
基础算法面试题---如何数组实现栈和队列
查看>>
API接口安全性设计以及各参数的作用
查看>>