PHP教程:PHP编程中的变量生计周期-Php-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝26
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:134回复:0

  PHP教程:PHP编程中的变量生计周期

楼主#
更多 发布于:2016-05-20 18:56

关于PHP的中的数据来历, 不外乎有俩种:

1. 来自代码中

关于代码中的变量(也即是直接量)来说, 变量分配/赋值在编译期, 活泼在执行器, 在恳求封闭期被毁掉.关于这些变量来说,

运用APC进行Opcode缓存, 则会缓存这有些变量的值.

而关于来自外部的变量, 变量分配/赋值在编译器后, 执行期前, 在恳求封闭期被毁掉,关于这些变量来说, 运用APC进行OpCode缓存,

是不会被缓存的.

今日就侧重重视下外部变量的一个有些,GET来的数据的全部生命周期.

假定, 有如下恳求到来:

而, 在index.php中:

1. 来自代码中

关于代码中的变量(也即是直接量)来说, 变量分配/赋值在编译期, 活泼在执行器, 在恳求封闭期被毁掉.关于这些变量来说,

运用APC进行Opcode缓存, 则会缓存这有些变量的值. 而关于来自外部的变量, 变量分配/赋值在编译器后, 执行期前,

在恳求封闭期被毁掉,关于这些变量来说, 运用APC进行OpCode缓存, 是不会被缓存的. 今日就侧重重视下外部变量的一个有些,GET来的数据的全部生命周期.

假定, 有如下恳求到来:

而, 在index.php中:

___FCKpd___2

咱们知道, 在最终的执行期, $_GET数组必定包含如下片段:

关于PHP的中的数据来历, 不外乎有俩种:

1. 来自代码中

关于代码中的变量(也即是直接量)来说, 变量分配/赋值在编译期, 活泼在执行器, 在恳求封闭期被毁掉.关于这些变量来说,

运用APC进行Opcode缓存, 则会缓存这有些变量的值. 而关于来自外部的变量, 变量分配/赋值在编译器后, 执行期前,

在恳求封闭期被毁掉,关于这些变量来说, 运用APC进行OpCode缓存, 是不会被缓存的. 今日就侧重重视下外部变量的一个有些,GET来的数据的全部生命周期.

假定, 有如下恳求到来:

而, 在index.php中:

1. 来自代码中

关于代码中的变量(也即是直接量)来说, 变量分配/赋值在编译期, 活泼在执行器, 在恳求封闭期被毁掉.关于这些变量来说,

运用APC进行Opcode缓存, 则会缓存这有些变量的值. 而关于来自外部的变量, 变量分配/赋值在编译器后, 执行期前,

在恳求封闭期被毁掉,关于这些变量来说, 运用APC进行OpCode缓存, 是不会被缓存的. 今日就侧重重视下外部变量的一个有些,GET来的数据的全部生命周期.

假定, 有如下恳求到来:

而, 在index.php中:

___FCKpd___2

咱们知道, 在最终的执行期, $_GET数组必定包含如下片段:

___FCKpd___3

那么, 咱们今日就要点重视下, Query String是怎么构建成_GET数组的(关于GET变量的生成, 请同时阅览我之前的文章:

“PHP的GET/POST等大变量生成进程“): 在恳求到来时间,php_request_startup(界说在main.c)被调用,来做初始化现场.

在这个进程中包含设置超时值,调用各个模块的恳求初始化函数. 当然也包含咱们关怀的, 创立变量环境.

php_hash_environment依据php.ini中的variables_order来顺次初始化各个预界说大变量, 那么关于$_GET来说:

...case 'g':case 'G': if (!_gpc_flags[2]) {

sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); _gpc_flags[2] = 1; if

(PG(register_globals)) { php_autoglobal_merge(&EG(symbol_table),

Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]) TSRMLS_CC); } }break;

大体能够看出,这段逻辑,首要经过treat_data来生成变量hash(PG(http_globals)[TRACK_VARS_GET]),

假如打开了auto_register_globals,则再把$_GET数组中的变量加入到符号表中.

treat_data是归于sapi_module_struct中的一个成员:

留意: 这篇文章基于apache2handler方法的sapi, 这个发动进程和之前的文章sapi原理中的发动进程略有不同,

php5经过注册apache2的ap_hook_post_config挂钩,在apache

server发动的时分发动php(php_apache_server_startup,界说在sapi/apache2hander/sapi_apache2.c中),

在这个函数中调用sapi_startup发动sapi,继而经过调用php_apache2_startup来注册sapi module

struct,然后调用php_module_startup来初始化PHP,

其间又会初始化ZEND引擎,以及填充zend_module_struct中的treat_data成员(经过php_startup_sapi_content_types)

如今回过头来持续看treat_data(也即是php_default_treat_data):

....if (arg == PARSE_GET) { /* GET data */ c_var =

SG(request_info).query_string; if (c_var && *c_var) { res = (char *)

estrdup(c_var); free_buffer = 1; } else { free_buffer = 0; }} else if (arg ==

PARSE_COOKIE) { /* Cookie data */

在上面的逻辑中, 给res仿制为query_string, SG(request_info)是一个代表了当时恳求信息的构造体,

其间query_string是在php_apache_request_ctor中经过仿制apache的reqeust_rec构造体中的args而来的.

关于这篇文章的比如来说, 此刻res即为”name=laruence&career[]=yahoo&career[]=baidu”,

持续在treat_data中, 随后的逻辑是:

var = php_strtok_r(res, separator, &strtok_buf);...while (var) { val =

strchr(var, '='); if (arg == PARSE_COOKIE) { /* Remove leading spaces from

cookie names, needed for multi-cookie header where ; can be followed by a space

*/ while (isspace(*var)) { var++; } if (var == val || *var == '\0') { goto

next_cookie; } } if (val) { /* have a value */ int val_len; unsigned int

new_val_len; *val++ = '\0'; php_url_decode(var, strlen(var)); val_len =

php_url_decode(val, strlen(val)); val = estrndup(val, val_len); if

(sapi_module.input_filter(arg, var, &val, val_len, &new_val_len

TSRMLS_CC)) { php_register_variable_safe(var, val, new_val_len, array_ptr

TSRMLS_CC); } efree(val); } else {

首要, 经过php_strtok_r把res依据”&”分割成一个一个的”key=value”段,

接下来分别为var和val仿制为key和value, 留意到这个进程中会分别对var和val做php_url_decode.

最终经过php_register_variable_safe, 给array_ptr(此刻指向PG(http_globals)[TRACK_VARS_GET],

也即是$_GET)增加一个名为var值为val的成员. 到了这一步, 咱们的$_GET数组中, 就包含了如下的成员:

'name' => 'laruence','career' => array( 'yahoo', 'baidu',

未完待续(变量的毁掉进程)… GET['name'];

咱们知道, 在最终的执行期, $_GET数组必定包含如下片段:

___FCKpd___3

那么, 咱们今日就要点重视下, Query String是怎么构建成_GET数组的(关于GET变量的生成, 请同时阅览我之前的文章:

“PHP的GET/POST等大变量生成进程“): 在恳求到来时间,php_request_startup(界说在main.c)被调用,来做初始化现场.

在这个进程中包含设置超时值,调用各个模块的恳求初始化函数. 当然也包含咱们关怀的, 创立变量环境.

php_hash_environment依据php.ini中的variables_order来顺次初始化各个预界说大变量, 那么关于$_GET来说:

___FCKpd___4

大体能够看出,这段逻辑,首要经过treat_data来生成变量hash(PG(http_globals)[TRACK_VARS_GET]),

假如打开了auto_register_globals,则再把$_GET数组中的变量加入到符号表中.

treat_data是归于sapi_module_struct中的一个成员:

___FCKpd___5

如今回过头来持续看treat_data(也即是php_default_treat_data):

___FCKpd___6

在上面的逻辑中, 给res仿制为query_string, SG(request_info)是一个代表了当时恳求信息的构造体,

其间query_string是在php_apache_request_ctor中经过仿制apache的reqeust_rec构造体中的args而来的.

关于这篇文章的比如来说, 此刻res即为”name=laruence&career[]=yahoo&career[]=baidu”,

持续在treat_data中, 随后的逻辑是:

___FCKpd___7

首要, 经过php_strtok_r把res依据”&”分割成一个一个的”key=value”段,

接下来分别为var和val仿制为key和value, 留意到这个进程中会分别对var和val做php_url_decode.

最终经过php_register_variable_safe, 给array_ptr(此刻指向PG(http_globals)[TRACK_VARS_GET],

也即是$_GET)增加一个名为var值为val的成员. 到了这一步, 咱们的$_GET数组中, 就包含了如下的成员:

___FCKpd___8

未完待续(变量的毁掉进程)… GET = array( 'name' => 'laruence', 'career' => array(

'yahoo', 'baidu', ),

那么, 咱们今日就要点重视下, Query String是怎么构建成_GET数组的(关于GET变量的生成, 请同时阅览我之前的文章:

“PHP的GET/POST等大变量生成进程“): 在恳求到来时间,php_request_startup(界说在main.c)被调用,来做初始化现场.

在这个进程中包含设置超时值,调用各个模块的恳求初始化函数. 当然也包含咱们关怀的, 创立变量环境.

php_hash_environment依据php.ini中的variables_order来顺次初始化各个预界说大变量, 那么关于$_GET来说:

___FCKpd___4

大体能够看出,这段逻辑,首要经过treat_data来生成变量hash(PG(http_globals)[TRACK_VARS_GET]),

假如打开了auto_register_globals,则再把$_GET数组中的变量加入到符号表中.

treat_data是归于sapi_module_struct中的一个成员:

___FCKpd___5

如今回过头来持续看treat_data(也即是php_default_treat_data):

___FCKpd___6

在上面的逻辑中, 给res仿制为query_string, SG(request_info)是一个代表了当时恳求信息的构造体,

其间query_string是在php_apache_request_ctor中经过仿制apache的reqeust_rec构造体中的args而来的.

关于这篇文章的比如来说, 此刻res即为”name=laruence&career[]=yahoo&career[]=baidu”,

持续在treat_data中, 随后的逻辑是:

___FCKpd___7

首要, 经过php_strtok_r把res依据”&”分割成一个一个的”key=value”段,

接下来分别为var和val仿制为key和value, 留意到这个进程中会分别对var和val做php_url_decode.

最终经过php_register_variable_safe, 给array_ptr(此刻指向PG(http_globals)[TRACK_VARS_GET],

也即是$_GET)增加一个名为var值为val的成员. 到了这一步, 咱们的$_GET数组中, 就包含了如下的成员:

___FCKpd___8

未完待续(变量的毁掉进程)… GET['name'];

咱们知道, 在最终的执行期, $_GET数组必定包含如下片段:

___FCKpd___3

那么, 咱们今日就要点重视下, Query String是怎么构建成_GET数组的(关于GET变量的生成, 请同时阅览我之前的文章:

“PHP的GET/POST等大变量生成进程“):

在恳求到来时间,php_request_startup(界说在main.c)被调用,来做初始化现场.

在这个进程中包含设置超时值,调用各个模块的恳求初始化函数. 当然也包含咱们关怀的, 创立变量环境.

php_hash_environment依据php.ini中的variables_order来顺次初始化各个预界说大变量,

那么关于$_GET来说:

___FCKpd___4

大体能够看出,这段逻辑,首要经过treat_data来生成变量hash(PG(http_globals)[TRACK_VARS_GET]),

假如打开了auto_register_globals,则再把$_GET数组中的变量加入到符号表中.

treat_data是归于sapi_module_struct中的一个成员:

___FCKpd___5

如今回过头来持续看treat_data(也即是php_default_treat_data):

___FCKpd___6

在上面的逻辑中, 给res仿制为query_string, SG(request_info)是一个代表了当时恳求信息的构造体,

其间query_string是在php_apache_request_ctor中经过仿制apache的reqeust_rec构造体中的args而来的.

关于这篇文章的比如来说,

此刻res即为”name=laruence&career[]=yahoo&career[]=baidu”,

持续在treat_data中, 随后的逻辑是:

___FCKpd___7

首要, 经过php_strtok_r把res依据”&”分割成一个一个的”key=value”段,

接下来分别为var和val仿制为key和value, 留意到这个进程中会分别对var和val做php_url_decode.

最终经过php_register_variable_safe,

给array_ptr(此刻指向PG(http_globals)[TRACK_VARS_GET], 也即是$_GET)增加一个名为var值为val的成员.

到了这一步, 咱们的$_GET数组中, 就包含了如下的成员:

___FCKpd___8

未完待续(变量的毁掉进程)…

优质IT资源分享社区[font=Tahoma  ]为你提供此文。[font=Tahoma  ]

[font=Tahoma  ]本站有大量优质php教程视频,资料等资源,包含php基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。[font=Tahoma  ]

php教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客