原创文章,转载请注明: 转载自庆亮的博客-webgame架构

本文链接地址: PHP扩展之自定义全局变量

跟踪了一下PHP$_GET$_POST的产生过程,发现通过zend提供的函数和宏可以很方便注册自己的全局数组。相关的函数和宏:

END_API int zend_register_auto_global(

char *name, //全局数组名

uint name_len,  //数组名称长度- 1

zend_auto_global_callback auto_global_callback TSRMLS_DC //数组初始化回调函数

);

#define ZEND_SET_SYMBOL(symtable, name, var) \

{ \

char *_name = (name); \

\

ZEND_SET_SYMBOL_WITH_LENGTH(symtable, _name, strlen(_name)+1, var, 1, 0); \

}

下面来注册我们的全局变量,假设我们的扩展名为test,我们在MINIT中进行注册操作。

zend_bool ming_global_callback(char *name, uint name_len TSRMLS_DC)

{

        zval *tmp;

        MAKE_STD_ZVAL(tmp);

        array_init(tmp);

        add_next_index_long(tmp,2222);

        ZEND_SET_SYMBOL(&EG(symbol_table), name, tmp);

}

PHP_MINIT_FUNCTION(test)

{

        /* If you have INI entries, uncomment these lines 

        REGISTER_INI_ENTRIES();

        */

        zend_register_auto_global("_MING"sizeof("_MING") - 1, ming_global_callback  TSRMLS_DC);

        return SUCCESS;

}

运行PHP代码 

<?php

var_dump($_MING);

结果:

array(1) {

  [0]=>

  int(2222)

}