声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
博客地址:
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]
分享到:
相关推荐
7. Array与HashTable:介绍数组在PHP内核中的表现形式,如何操作HashTable以及在内核中操作PHP语言中的数组。 8. PHP中的资源类型:资源是PHP中用来表示外部资源的一种特殊类型,包括持久化资源和它们的引用计数...
- **静态变量**:在函数内部定义的变量,即使函数执行结束,它的值也不会丢失。 PHP变量的内部实现涉及到内存管理和作用域的概念。例如,代码中的`change()`函数展示了变量的作用域。`$foo` 使用 `global` 关键字使...
这些功能模块可以被编译为静态链接到PHP内核中,也可以作为动态加载的模块,在运行时根据需要加载。 ##### 2. ZEND Engine工作原理 ZEND Engine是PHP的核心组件之一,它负责将PHP源代码编译成中间代码(opcode),...
讨论如何遵循最佳实践,如减少内存分配,使用静态变量,优化循环等,以提升扩展的性能。 8. **调试和错误处理** 学习如何使用Xdebug等工具调试C扩展,以及如何有效地处理和报告错误。 9. **安全考虑** 在扩展...
- 局部静态变量:在函数内部,`static`关键字用于创建只存在于该函数作用域内的静态变量,即使函数结束,其值也不会丢失。 - 静态类成员:静态属性和方法不需要实例化对象就能直接访问。静态属性不能通过实例对象...
### 深入理解PHP内核 #### 一、引言 《深入理解PHP内核》是一本专门针对PHP开发者深入了解PHP内部实现机制的专业书籍。本书不仅覆盖了PHP语言的基础特性,还深入探讨了PHP的编译过程、执行流程、内存管理等核心组件...
PHP 5.3对PHP内核进行了优化,包括更快的内存管理、更好的垃圾回收机制以及对SPL(Standard PHP Library)的增强,提高了整体性能。 以上就是PHP 5.3的主要特性介绍。通过深入学习这些知识点,开发者可以更好地利用...
PHP-CPP提供了丰富的API,可以方便地与PHP的内核交互,使得开发者能够充分利用C++的面向对象特性,同时保持与PHP脚本语言的无缝集成。 **C++与PHP的结合** C++是一种静态类型的、编译式的、通用的、大小写敏感的、...
在PHP 5.3版本之前,configuration_hash是一个静态变量,只能在php_ini.c中访问。这使得其他PHP扩展难以直接访问配置信息。然而,在PHP 5.3版本之后,增加了php_ini_get_configuration_hash接口,使得任何PHP扩展都...
帝国cms内核的程序需要生成HTML静态页面,不懂帝国cms的童鞋建议多学习后再来测试这套源码,免得下载后说什么不完整,什么没有网站页面。 采集配置: 1、修改发布模块,修改后台地址 2、修改每条规则的,附件保存...
总体而言,《PHP快速入门指南(第7版)》涵盖了从基础到高级的PHP编程技术,它不仅为初学者提供了从零开始学习PHP的路径,还为有经验的开发者提供了深入理解PHP内核、内存管理、线程安全、扩展开发和命名空间等高级...
8、日常更新需要登陆PC及手机后台帝国cms内核的程序需要生成HTML静态页面,不懂帝国cms的童鞋建议多学习后再来测试这套源码,免得下载后说什么不完整,什么没有网站页面。采集配置:1、修改发布模块,修改后台地址2...
- 获取函数中的静态变量。 - **`public mixed invoke(mixed ...$args)`**: - 调用函数,可以通过参数列表传递参数。 - **`public mixed invokeArgs(array $args)`**: - 调用函数,可以通过数组传递参数。 - ...
《基于ThinkPHP内核的简易员工管理系统源码解析》 ThinkPHP是一款国内广泛使用的轻量级PHP开发框架,以其简洁、高效的特性深受开发者喜爱。在这个名为"ThinkPHP内核简单员工管理系统源码.zip"的压缩包中,我们可以...
在PHP应用中,Nginx通常作为前端接收HTTP请求,将静态资源直接返回,将动态请求转发给PHP-FPM处理。 6. **.env-dist**:这是一个环境变量配置文件示例,用于Docker Compose根据其内容来定制各个服务的环境变量。 7...
PHP内核创建对象的过程包括`ZEND_FETCH_CLASS`(查找类信息)、`NEW`(初始化对象)和可能的构造函数调用。对于私有或受保护的成员变量,如果通过`__get`或自定义的getter方法访问,那么还会触发方法调用,这无疑会...
2. 模板引擎:内置的模版引擎支持丰富的语法和函数,如变量输出、条件判断、循环等,方便开发者快速构建用户界面。 3. URL路由:通过配置URL规则,可以实现友好的URL,提升用户体验,同时便于搜索引擎优化。 4. ...
本教程将基于内核为2.4.20-8的Red Hat 9 Linux操作系统进行,尽管其他Linux发行版或不同内核可能有所不同,但基本步骤和原理相似。 首先,我们需要下载必要的软件包: 1. JDK: 例如`jdk-1_5_0_02-nb-4_0-ml-linux....