`
dengbaoleng
  • 浏览: 1162883 次
文章分类
社区版块
存档分类
最新评论

原创:PHP内核研究 静态变量

 
阅读更多

声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
博客地址:PHP技术博客在CSDN也会同步更新的哦.
欢迎转载,转载请注明出处

静态变量

它可以是 静态全局变量,如果不调用unset,那么这个静态变量会一直存在,直到程序退出时才由Zend内存管理来释放

它可以是 静态局部变量:在函数里定义,函数执行完后,该静态变量不会消失

它可以是 静态成员变量:在类里定义,它可以在所有类的对象中共享

例如

[php]

<?php

function test(){

static $a=1;

$a++;

}

test(); //$a=2

test();//$a=3

test();//$a=4

[/php]

最后 $a=4了..

下面我们从内核里面分析它

static不是一个函数 ,它是一个关键字 ,所以只能从LEX语法分析中来查找

打开 zend/zend_language_scanner.l 查找 static

找到代码

[c]
<ST_IN_SCRIPTING>"static" {
return T_STATIC;
}
[/c]


是一个宏
再打开 zend/zend_language_pareser.l
搜 T_STATIC
找到代码

[c]
T_STATIC static_var_list ';'
[/c]


跟进 static_var_list
找到代码

[c]
static_var_list:
static_var_list ',' T_VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); }
| static_var_list ',' T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC); }
| T_VARIABLE { zend_do_fetch_static_variable(&$1, NULL, ZEND_FETCH_STATIC TSRMLS_CC); }
| T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$1, &$3, ZEND_FETCH_STATIC TSRMLS_CC); }

;
[/c]


就是这里了..它由PHP的语法分析程序 解析成上面的代码
zend_do_fetch_static_variable 这个函数就是了
它在zend/zend_compile.c里定义
代码如下

[c]
void zend_do_fetch_static_variable(znode *varname, const znode *static_assignment, int fetch_type TSRMLS_DC)
{
zval *tmp; //一个临时变量
zend_op *opline;
znode lval;
znode result;

ALLOC_ZVAL(tmp); //申请一块内存

if (static_assignment) {
*tmp = static_assignment->u.constant;
} else {
INIT_ZVAL(*tmp);
}
if (!CG(active_op_array)->static_variables) {//初始化静态变量的HASH 键值
ALLOC_HASHTABLE(CG(active_op_array)->static_variables);
//初始化HASH值
zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0);
}
zend_hash_update(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, &tmp, sizeof(zval *), NULL);

if (varname->op_type == IS_CONST) {
if (Z_TYPE(varname->u.constant) != IS_STRING) {
convert_to_string(&varname->u.constant);
}
}

opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_VAR;
opline->result.u.EA.type = 0;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->op1 = *varname;
SET_UNUSED(opline->op2);
opline->op2.u.EA.type = ZEND_FETCH_STATIC;
result = opline->result;

if (varname->op_type == IS_CONST) {
zval_copy_ctor(&varname->u.constant);
}
fetch_simple_variable(&lval, varname, 0 TSRMLS_CC); /* Relies on the fact that the default fetch is BP_VAR_W */

if (fetch_type == ZEND_FETCH_LEXICAL) {
znode dummy;

zend_do_begin_variable_parse(TSRMLS_C);
zend_do_assign(&dummy, &lval, &result TSRMLS_CC);
zend_do_free(&dummy TSRMLS_CC);
} else {
zend_do_assign_ref(NULL, &lval, &result TSRMLS_CC);
}
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED;

/* zval_dtor(&varname->u.constant); */
}
[/c]
分享到:
评论

相关推荐

    php扩展开发与内核应用

    7. Array与HashTable:介绍数组在PHP内核中的表现形式,如何操作HashTable以及在内核中操作PHP语言中的数组。 8. PHP中的资源类型:资源是PHP中用来表示外部资源的一种特殊类型,包括持久化资源和它们的引用计数...

    PHP内核探索:变量概述

    - **静态变量**:在函数内部定义的变量,即使函数执行结束,它的值也不会丢失。 PHP变量的内部实现涉及到内存管理和作用域的概念。例如,代码中的`change()`函数展示了变量的作用域。`$foo` 使用 `global` 关键字使...

    深入php内核分析与讲解

    这些功能模块可以被编译为静态链接到PHP内核中,也可以作为动态加载的模块,在运行时根据需要加载。 ##### 2. ZEND Engine工作原理 ZEND Engine是PHP的核心组件之一,它负责将PHP源代码编译成中间代码(opcode),...

    深入理解PHP内核,PHP扩展开发

    讨论如何遵循最佳实践,如减少内存分配,使用静态变量,优化循环等,以提升扩展的性能。 8. **调试和错误处理** 学习如何使用Xdebug等工具调试C扩展,以及如何有效地处理和报告错误。 9. **安全考虑** 在扩展...

    详解PHP后期静态绑定分析与应用

    - 局部静态变量:在函数内部,`static`关键字用于创建只存在于该函数作用域内的静态变量,即使函数结束,其值也不会丢失。 - 静态类成员:静态属性和方法不需要实例化对象就能直接访问。静态属性不能通过实例对象...

    深入理解PHP内核.pdf

    ### 深入理解PHP内核 #### 一、引言 《深入理解PHP内核》是一本专门针对PHP开发者深入了解PHP内部实现机制的专业书籍。本书不仅覆盖了PHP语言的基础特性,还深入探讨了PHP的编译过程、执行流程、内存管理等核心组件...

    PHP.zip_php5.3_php5.3 chm

    PHP 5.3对PHP内核进行了优化,包括更快的内存管理、更好的垃圾回收机制以及对SPL(Standard PHP Library)的增强,提高了整体性能。 以上就是PHP 5.3的主要特性介绍。通过深入学习这些知识点,开发者可以更好地利用...

    cpp-PHPCPP使用C来构建PHP扩展的库

    PHP-CPP提供了丰富的API,可以方便地与PHP的内核交互,使得开发者能够充分利用C++的面向对象特性,同时保持与PHP脚本语言的无缝集成。 **C++与PHP的结合** C++是一种静态类型的、编译式的、通用的、大小写敏感的、...

    php中的ini配置原理详解

    在PHP 5.3版本之前,configuration_hash是一个静态变量,只能在php_ini.c中访问。这使得其他PHP扩展难以直接访问配置信息。然而,在PHP 5.3版本之后,增加了php_ini_get_configuration_hash接口,使得任何PHP扩展都...

    仿做菜网整站源码(帝国cms内核) v2.0.zip

    帝国cms内核的程序需要生成HTML静态页面,不懂帝国cms的童鞋建议多学习后再来测试这套源码,免得下载后说什么不完整,什么没有网站页面。 采集配置: 1、修改发布模块,修改后台地址 2、修改每条规则的,附件保存...

    《PHP快速入门指南(第7版)》

    总体而言,《PHP快速入门指南(第7版)》涵盖了从基础到高级的PHP编程技术,它不仅为初学者提供了从零开始学习PHP的路径,还为有经验的开发者提供了深入理解PHP内核、内存管理、线程安全、扩展开发和命名空间等高级...

    仿做菜网整站源码(帝国cms内核) v2.0

    8、日常更新需要登陆PC及手机后台帝国cms内核的程序需要生成HTML静态页面,不懂帝国cms的童鞋建议多学习后再来测试这套源码,免得下载后说什么不完整,什么没有网站页面。采集配置:1、修改发布模块,修改后台地址2...

    php反射api.pdf

    - 获取函数中的静态变量。 - **`public mixed invoke(mixed ...$args)`**: - 调用函数,可以通过参数列表传递参数。 - **`public mixed invokeArgs(array $args)`**: - 调用函数,可以通过数组传递参数。 - ...

    ThinkPHP内核简单员工管理系统源码.zip

    《基于ThinkPHP内核的简易员工管理系统源码解析》 ThinkPHP是一款国内广泛使用的轻量级PHP开发框架,以其简洁、高效的特性深受开发者喜爱。在这个名为"ThinkPHP内核简单员工管理系统源码.zip"的压缩包中,我们可以...

    docker-compose构建通用php+mysql+nginx包

    在PHP应用中,Nginx通常作为前端接收HTTP请求,将静态资源直接返回,将动态请求转发给PHP-FPM处理。 6. **.env-dist**:这是一个环境变量配置文件示例,用于Docker Compose根据其内容来定制各个服务的环境变量。 7...

    PHP代码优化之成员变量获取速度对比

    PHP内核创建对象的过程包括`ZEND_FETCH_CLASS`(查找类信息)、`NEW`(初始化对象)和可能的构造函数调用。对于私有或受保护的成员变量,如果通过`__get`或自定义的getter方法访问,那么还会触发方法调用,这无疑会...

    基于PHP的ThinkPHP轻量级PHP开发框架核心版源码.zip

    2. 模板引擎:内置的模版引擎支持丰富的语法和函数,如变量输出、条件判断、循环等,方便开发者快速构建用户界面。 3. URL路由:通过配置URL规则,可以实现友好的URL,提升用户体验,同时便于搜索引擎优化。 4. ...

    安装Jdk+tomcat+apache+PHP+mysql(linux).pdf

    本教程将基于内核为2.4.20-8的Red Hat 9 Linux操作系统进行,尽管其他Linux发行版或不同内核可能有所不同,但基本步骤和原理相似。 首先,我们需要下载必要的软件包: 1. JDK: 例如`jdk-1_5_0_02-nb-4_0-ml-linux....

Global site tag (gtag.js) - Google Analytics