IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Zend Parameters Parser新增类型描述符介绍

风雪之隅 2011-07-07 00:04:20 累计浏览 3,453 次
本机暂存
f  - function or array containing php method call info (returned as
      zend_fcall_info and zend_fcall_info_cache)
H  - array or HASH_OF(object) (returned as HashTable*)
L  - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (long)
Z  - the actual zval (zval**)
*  - variable arguments list (0 or more)
+  - variable arguments list (1 or more)

     这也使得我们做扩展开发的时候, 能更加轻松的处理输入参数, 得到想要的值.

     比如没有f之前, 如果我们扩展中提供一个方法, 接受用户传入的一个回调函数, 那我们需要对用户传入的参数做判断:

1. 是字符串还是数组
2. 如果是字符串, 那么是否是一个可调用的回调函数
3. 如果是数组, 那么就分为, 调用类的静态方法, 和一个对象的方法俩种情况.
    并验证他们是否是可调用的回调函数.

     这个挺麻烦的吧? 而有了f, 我们就可以简单的:

PHP_FUNCTION(dummy) {
    zval *retval_ptr = NULL;
    zend_fcall_info fci;
    zend_fcall_info_cache fci_cache;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
            "f*", &fci, &fci_cache, &fci.params, &fci.param_count) == FAILURE) {
        return;
    }

    fci.retval_ptr_ptr = &retval_ptr;

    zend_call_function(&fci, &fci_cache TSRMLS_CC);
    .....
}

     是不是方便了很多呢?

     另外, 上面的例子也顺便介绍了”*”, 这个主要用来方便可变参数函数的开发. “+”也类似.

     最后要说的就是”H”.

     首先我们要说说PHP的一些历史原因, 导致PHP的对象, 其实也可以作为数组来使用, 这个时候默认的它的属性就会作为数组载体.

     这样, 当我们在扩展中的一个函数中申明要得到一个数组, 对于如下的object, 就无法直接调用:

$person = new StdClass();
$person->name = "Laruence";
$person->age   = 28;

     而如果我们在扩展的函数中使用”H”来申明我要得到一个数组, 那么如上的对象, 就可以直接作为合法参数使用了.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,148)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  7. Redis消息队列的若干实现方式 (累计阅读 12,088)
  8. 到底什么是MVC? (累计阅读 11,868)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,708)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,488)