如何在内部实现PHP静态变量?

时间:2014-02-17 14:27:13

标签: php c compiler-construction static

我希望xdebug有一天能够浏览所有静态变量和属性,但根据作者的说法,无法在引擎中获取这些变量列表。这对我来说是令人惊讶的,因为静态看起来就像具有孤立范围的全球变量。

它们是不是真的没有存储在哈希表中,还是表条目无法枚举的问题?

1 个答案:

答案 0 :(得分:2)

PHP函数可以在内部有两种:内部函数或用户定义函数。内部函数用C语言编写,可以做“任何事情”。用户定义的函数由带有元数据的“oparray”表示。 oparray包含PHP / ZE字节码形式的函数表达式。 oparray的一个元素包含一个包含所有静态变量的表。

因此,为了获得所有静态变量,必须迭代所有用户定义的函数(以及所有类中的类方法)并检查该数组。

对于全局函数,这个未经测试的C代码可能会起到作用:

int dump_statics(zend_function *function TSRMLS_DC)
{
    if (function->type == ZEND_USER_FUNCTION) {
        ulong    hashIndex    = 0;
        char*    hashKey      = NULL;
        int      hashKeyType  = 0;
        zend_hash_internal_pointer_reset(function->op_array.static_variables);
        while ((hashKeyType = zend_hash_get_current_key(function->op_array.static_variables, &hashKey, &hashIndex, 0)) {
            if (hashKeyType == HASH_KEY_IS_STRING) {
                php_printf("%s\n", hashkey);
            }
            zend_hash_move_forward(function->op_array.static_variables);
        }
    }
    return 0;
}
zend_hash_apply(EG(function_table), (apply_func_t) dump_statics TSRMLS_CC);

对于类方法,必须迭代EG(class_table),然后包含类条目的funtion_table ......作为练习留给读者。 (正如测试上面的代码一样)


更新

我已经创建了一个简单的PHP扩展。它可以从https://github.com/johannes/php-staticvardumper

获得