• php7扩展开发[7]含有两个类的扩展模块


    在我们写扩展时,就像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" ; then 
      PHP_NEW_EXTENSION(play, play.c udf.c adf.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
    
    在play.c的MINIT函数中加上
        ZEND_MODULE_STARTUP_N(udf) (INIT_FUNC_ARGS_PASSTHRU);
        ZEND_MODULE_STARTUP_N(adf) (INIT_FUNC_ARGS_PASSTHRU);
    
    第三步执行
    phpize 
    ./configure --with-php-config=/usr/bin/php-config --enable-debug
    make && make install
    
    
    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",&param1,&param2) == 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, &param1 TSRMLS_DC);
        get2 = zend_read_property(adf_ce, getThis(), "param2", sizeof("param2")-1, 0, &param2 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)
    {
        /* If you have INI entries, uncomment these lines
        REGISTER_INI_ENTRIES();
        */
    
        ZEND_MODULE_STARTUP_N(udf) (INIT_FUNC_ARGS_PASSTHRU);
        ZEND_MODULE_STARTUP_N(adf) (INIT_FUNC_ARGS_PASSTHRU);
        return SUCCESS;
    }
    
    • 请尊重本人劳动成功,可以随意转载但保留以下信息
    • 作者:岁月经年
    • 时间:2016年03月
    • 首发:http://www.djhull.com
  • 相关阅读:
    QR code 乱谈(一)
    用JAVA实现数字水印(可见)
    ctf总结
    Unix/Linux常用命令
    C语言概述
    C语言发发展历史
    为什么要学习C语言
    计算机应用领域
    计算机发展趋势
    如何学习计算机
  • 原文地址:https://www.cnblogs.com/djhull/p/5359650.html
Copyright © 2020-2023  润新知