在我们写扩展时,就像YAF不会是用一个类文件来完成一个扩展功能,所以我们要在一个扩展模块里
调起几个类的实例,同类之间的方法,可以相互调用,不同类之间的实例,应该也可以调用,下面我
们就用一个例子来说明。
首先我们先创建play扩展模块,再创建adf扩展模块,最后创建udf扩展模块,
我们要做到的是php -m中显示加载了play,我们可以调用adf类和udf类。
第一步:
在adf和udf类中各实现set get方法,然后初始化minit中的内容
运行成功后,将adf.c php_adf.h和udf.c php_udf.h拷入play文件中
第二步
修改play文件夹中的config.m4:
if test -z "$PHP_DEBUG"
adf.c
zend_class_entry *adf_ce;
//新增定义
ZEND_BEGIN_ARG_INFO_EX(global_setkey_arg, 0, 0, 2)
ZEND_ARG_INFO(0, key1)
ZEND_ARG_INFO(0, key2)
ZEND_END_ARG_INFO()
ZEND_METHOD(adf,__construct){
RETURN_NULL();
}
ZEND_METHOD(adf,set){
zval *param1;
zval *param2;
array_init(param2);
//int zend_parse_parameters ( int num_args TSRMLS_DC, char* type_spec, ... )
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|z",¶m1,¶m2) == FAILURE) {
RETURN_FALSE;
}
zend_update_property(adf_ce, getThis(), "param1", sizeof("param1")-1, param1 TSRMLS_CC);
zend_update_property(adf_ce, getThis(), "param2", sizeof("param2")-1, param2 TSRMLS_CC);
RETURN_NULL();
}
ZEND_METHOD(adf,get){
array_init(return_value);
zval *get1;
zval *get2;
zval param1; //php >=7.0
zval param2; //php >=7.0
get1 = zend_read_property(adf_ce, getThis(), "param1", sizeof("param1")-1, 0, ¶m1 TSRMLS_DC);
get2 = zend_read_property(adf_ce, getThis(), "param2", sizeof("param2")-1, 0, ¶m2 TSRMLS_DC);
add_next_index_string(return_value,Z_STRVAL_P(get1));
add_next_index_string(return_value,Z_STRVAL_P(get2));
//add_assoc_string(return_value, "param1", ZEND_STRL("test1"));
//add_assoc_string(return_value, "param2", ZEND_STRL("test2"));
RETURN_ZVAL(return_value, 1, 0);
}
const zend_function_entry adf_functions[] = {
PHP_ME(adf, __construct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(adf,set,global_setkey_arg,ZEND_ACC_PUBLIC)
PHP_ME(adf,get,NULL,ZEND_ACC_PUBLIC)
PHP_ME(adf,calladf,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_FE_END /* Must be the last line in adf_functions[] */
};
PHP_MINIT_FUNCTION(adf)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "adf", adf_functions);
adf_ce = zend_register_internal_class(&ce TSRMLS_CC);
return SUCCESS;
}
play.c中代码:
PHP_MINIT_FUNCTION(play)
{