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

看一段简单的代码

$a = 1;

echo "aaaa\n";

然后查到赋值对应的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();

}

php refcount,php变量引用和计数_refcount_gc和is_ref_gc相关推荐

  1. php变量的引用与计数规则

    为什么80%的码农都做不了架构师?>>>    变量的内部引用和计数 在引擎内部,一个PHP的变量是保存在"zval"结构中,此结构包含了变量的类型和值信息,这个 ...

  2. YAML文件(.yml)中的键(key)通过变量引用来设置

    转自:https://www.cnblogs.com/haycheng/p/13299183.html 通过变量引用设置配置量的[值](value) 在YAML文件中,一个配置量的值可以通过引用另一个 ...

  3. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  4. 帝国cms 7.5 wap变量引用(头尾变量引用方法)

    帝国cms 7.5 wap变量引用(头尾变量引用方法) 公共变量 做为菜鸟来说,做PC站引用公共变量是非常方便的.如头部:[!–temp.header–]:尾部:[!–temp.footer–]:不管 ...

  5. 虚幻4学习笔记(7)蓝图通信、变量引用、物体自转、点名系统

    虚幻4学习笔记 蓝图通信 角色加速(案例) 变量引用 方法一 提升变量 方法二 添加变量后设置 变量有效性 物体自转 点名系统 控制单个旋转 控制所有物体旋转 B站UP谌嘉诚课程:https://ww ...

  6. shell脚本里变量引用 数组引用 遍历数组

    shell脚本里变量引用 数组引用 遍历数组 1.定义的变量-引用变量方式 name=zhangecho $name 或 echo ${name} 2.命令执行结果-引用变量方式 两种方式$()和`` ...

  7. python中的变量的引用_python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  8. Python变量引用错误

    参考    Python变量引用错误 - 云+社区 - 腾讯云 python UnboundLocalError: local variable 'xxx' referenced before ass ...

  9. python赋值中文变量_Python变量引用赋值

    不,你不能.正如其他答案所指出的,你可以(ab?)使用可变对象的别名来实现类似的效果.然而,这与C++引用不一样,我想解释一下实际上发生了什么,以避免任何误解.<>你可以看到,在C++(和 ...

最新文章

  1. 事务,视图及索引!!!
  2. 索尔维会议记录软件测试,索尔维会议
  3. 03-运行时数据区概述及线程
  4. ERROR Invalid options in vue.config.js: “baseUrl“ is not allowed
  5. python中knn_如何在python中从头开始构建knn
  6. linux下node-sass安装失败
  7. CSS中可以和不可以继承的属性
  8. 滴滴辟谣被美团收购;苹果提交认证 9 款新手机;VS Code 1.46 发布 | 极客头条
  9. Atitit UEHP手机信息安全法 目录 1. 敏感数据清理 1 2. 数据集清理 1 3. Acc清理 1 4. 短信 通讯录 通话记录清理 1 5. Sim tf卡 2 6. 每个app过一
  10. ASP.NET Core的Telerik UI,创建数据丰富的桌面
  11. 应届毕业生怎么找java工作,应届毕业生怎么能找到高薪工作?
  12. 产品分析报告:潮汐-从番茄钟到场景化放松空间
  13. SDS新书的来龙去脉 amp;amp; SDS序言 - 倪光南:众筹出书也是一种创新
  14. 我们是怎么简单打开百度的?
  15. ROS机器人的远程启动和控制过程
  16. 设计必备,5个免费图标资源网站
  17. stm32L1151用cube配置ADC
  18. GDOI2021赛后总结高一赛季总结
  19. 浅析如何减小iOS版微信安装包的大小
  20. 2017.08.05

热门文章

  1. linux 下的sar工具命令小结
  2. 梦如果实现以后。。。。。。
  3. php会话控制区别和流程,PHP会话控制:cookie和session区别与用法深入理解_后端开发...
  4. 传感器绕着世界坐标系旋转产生的疑惑
  5. android获取其他app布局,android - 如何从App的(布局)XML变量中获取Manifest版本号?...
  6. python捕获所有异常状态_如何在scrapy中捕获并处理各种异常
  7. c语言如何删除数组中的某一个元素_数据结构之线性表高效删除重复元素
  8. day21—AngularJS学习初体验
  9. Centos6.8下SVN安装
  10. Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据...