background image

                    

  如何在 php 内置函数中添加自定义函数

在写扩展的时候,肯定不能什么功能都自己实现,原因有很多,开发效率、性能问题、维
护成本等。这就避免不了要在扩展里调用 PHP 内核函数。那么如何在扩展里面使用我们的
内置函数呢?PHP 既然有函数,肯定提供了调用函数的接口,这里有两个函数:

    ZEND_API   int   call_user_function(HashTable   *function_table,   zval   **object_pp,   zval 
*function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC);

    ZEND_API int call_user_function_ex(HashTable *function_table, zval **object_pp, zval 
*function_name,   zval   **retval_ptr_ptr,   zend_uint   param_count,   zval   **params[],   int 
no_separation, HashTable *symbol_table TSRMLS_DC);

  很可惜,只找到声明的地方,没有找到注释的地方,从声明来看,call_user_function 
封装了 call_user_function_ex,少了两个传参:

  int no_separation:这个的用意就是是否对 zval 进行分离,不过此功能现在已经不用
了,如果设为 1 则直接会出错,分离的作用是为了优化空间。

  symbol_table :是干吗用的,确实目前还不知道。

  HashTable* function_table  

 

: 函数表,我们都知道 用户函数也好,其他内置函数也好

都会存在 hashtable 里面,function_table 会保存所有内置函数和用户函数,用 CG 来获取,

 

因为函数表属于是 编译全局变量。

  zval **object_pp:这个是用来我们调用类里的某个方法的对象,看到这里,你恍然大
悟没有,调用普通函数和调用类的方法是同一个,

  function_table 和 object_pp 只需要一个就可以了。

  zval **retval_ptr_ptr:是函数的返回值。

  zend_uint param_count:函数/

 

方法 的参数个数

  zval **params[] :函数/方法的参数指针。

  那么清楚了两个 API 的参数及调用方法之后,我们来测试一下,究竟如何来使用。首

 

 

先 创建一个 扩展文件

  /ext/ext_skel –extname=call_func

  修改 config.m4