美文网首页PHP实战
PHP 扩展 - 运行时注册函数

PHP 扩展 - 运行时注册函数

作者: Bun_Wong | 来源:发表于2016-07-24 13:38 被阅读137次

    Azalea 项目中,当进行 View 视图渲染时,需要动态增加几个模板文件中使用的函数,如下面的模板文件代码片段

    // 增加了 p 方法用于 HTML 转义输出,并支持 printf 格式
    <span><?php p('您好 %s, %s好', $username, date('H') <= 12 ? '上午' : '下午'); ?></span>
    // 增加了 url 方法用于输出绝对路径
    <a href="<?php echo url('login') ?>">登录</a>
    

    先需要类似普通的模块 functions 注册

    static zend_function_entry azalea_template_functions[] = {
        ZEND_NAMED_FE(p, ZEND_FN(azalea_template_printf), NULL)  // 注册 p
        ZEND_NAMED_FE(url, ZEND_FN(azalea_url), NULL)  // 注册 url
        PHP_FE_END
    };
    
    /* {{{ proto void p( string $format [, mixed $args [, mixed $... ]] ) */
    PHP_FUNCTION(azalea_template_printf)
    {
        zend_string *result, *text;
        // 参考 formatted_print.c 实现了一个 azaleaSprintf 方法
        if ((result = azaleaSprintf(execute_data)) == NULL) {
            RETURN_FALSE;
        }
        // 然后进行 HTML 转义
        text = php_escape_html_entities_ex((unsigned char *) ZSTR_VAL(result), ZSTR_LEN(result), 0, ENT_QUOTES, get_default_charset(), 1);
        zend_string_release(result);
        // 输出
        PHPWRITE(ZSTR_VAL(text), ZSTR_LEN(text));
        zend_string_release(text);
    }
    /* }}} */
    

    然后在需要注册函数的地方,调用 zend_register_functions

    zend_register_functions(NULL, azalea_template_functions, NULL, MODULE_TEMPORARY);
    

    当然你可能还需要在结束时删除这些临时 functions

    zend_unregister_functions(azalea_template_functions, -1, NULL);
    

    相关文章

      网友评论

        本文标题:PHP 扩展 - 运行时注册函数

        本文链接:https://www.haomeiwen.com/subject/guawjttx.html