编辑:明确地说,我想识别并跟踪被调用的函数,而不会引起对class.function字符串进行哈希处理的开销和歧义。我希望php保留一些内部哈希值。
我正在开发扩展程序,我想要一种可靠的方式来获取特定的哈希码zend_execute_data->zend_function
,而无需在函数名称上调用某些哈希函数的开销(无论如何,这将导致与重载函数发生冲突)。
_zend_execute_data.opline具有一个名为“ extended_value”的字段,看起来像对op1中的内容设置了zend_hash_function的值一样,但前提是op2是常量。
if (opline->op2.op_type == IS_CONST) {
...
opline->extended_value = zend_hash_func(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant) + 1);
我不确定op2类型IS_CONST是什么意思,也不确定这是否可靠。而且我不确定此哈希码是否用于函数定义或类中的特定实例。
编辑:我猜IS_CONST意味着该函数不是对象实例的成员。
还有什么可以用作execute_data-> zend_function的哈希代码代理的吗?
一种非常简单的方法是使用zend_function *
自身的指针索引到哈希表中。即(unsigned long) (uintptr_t) func
用作索引。
这种方法有一个警告:尽管函数/方法通常zend_function *
在脚本的生存期内具有唯一性,但在某些情况下(如__call
魔术),zend_function *
会分配一个临时结构。在这些情况下,ZEND_ACC_CALL_VIA_HANDLER
将在功能上设置标志。如果还想支持这些情况,则必须为它们使用单独的机制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句