zoukankan      html  css  js  c++  java
  • [php-src]扩展中封装业务与 call_user_function 的使用建议

    内容均以php5.6.14为例.

    从一个封装 uniqid 的例子来讲。

    /* {{{ wrapper of uniqid */
    PHP_FUNCTION(fox)
    {
    // #1. zval
    *prefix, *more = NULL; zval function, *params[2] = {0}; // #2. if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z", &prefix, &more) == FAILURE ) { RETURN_FALSE; } params[0] = prefix; if (more) { params[1] = more; } // #3. ZVAL_STRING(&function, "uniqid", 0);
    // #4. if ( call_user_function(EG(function_table), NULL, &function, return_value, ZEND_NUM_ARGS(), params TSRMLS_CC) == FAILURE ) { if (return_value) { zval_dtor(return_value); } zend_error(E_WARNING, "%s() calling %s() failed.", get_active_function_name(TSRMLS_C), Z_STRVAL(function)); RETURN_FALSE; } RETURN_STRING(Z_STRVAL_P(return_value), 0); } /* }}} */

    #1.

    zval 不赋值默认是非空,不要随意给 声明的 zval 赋值为 NULL,除非你知道自己在干什么,比方用在判断是否有传参;

    如果你想对可选的参数使用默认值 farwish,可以像下面这样 (非用于上例):

    if (more == NULL) {
        MAKE_STD_ZVAL(more);
        Z_STRVAL_P(more) = "farwish";
        Z_STRLEN_P(more) = strlen("farwish");
        Z_TYPE_P(more) = IS_STRING;
    }
    params[1] = more;

    还有别忘了 call_user_function 中的参数个数就不能再用 ZEND_NUM_ARGS(),写固定值 2 就可以了。

    #2.

    接收的参数类型必须用双引号包裹,为了避免其它地方也遇到这种错误,最好后面统一都用双引号。

    如果接收的参数含 char *name 类型的, 别忘了要有 uint *len 跟在它后面传入。

    #3. #4.

    如果开头声明的是 zval *function, 并且 ZVAL_STRING 赋值 和 call_user_function 的调用都传 function, 编译能通过, 但是使用会segmentaion fault;测试证明, ZVAL_STRING 第一个参数一定是指向 zval 的地址, 而不是简单的传 zval *, 因为宏中做了 zval *__z = (z) 这么一件事, 如果 z 已经是指针, 那么值就不对了.

    ./Zend/zend_execute_API.c:575

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

    zval function_name, retval_ptr;

    Thats all.

    开发文档:https://github.com/farwish/php-core-hack

    Link:http://www.cnblogs.com/farwish/p/5635429.html

  • 相关阅读:
    【原创】构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)
    .NET 并行(多核)编程系列之七 共享数据问题和解决概述
    架构设计解惑
    项目开发经验谈之:设计失败的挫败感
    项目开发经验谈之:忆第一次设计Framework
    盲目的项目开发
    扩展GridView之添加单选列
    日期转换格式
    动手完善个性化弹出提示框的过程及乐趣
    SQL开发中容易忽视的一些小地方(六)
  • 原文地址:https://www.cnblogs.com/farwish/p/5635429.html
Copyright © 2011-2022 走看看