编写PHP扩展函数的参数类型绑定

巴扎黑
发布: 2016-12-07 15:25:43
原创
1894人浏览过

我们看一下如何通过其实现类型绑定,但这个特性只能在zend engine 2也就是php5中使用。 让我们再回顾一下ze2's argument info结构。每一个arg info结构的声明都是通过zend_begin_arg_info()或者zend_begin_arg_info_ex()宏函数开始的,然后紧跟着几行zend_arg_*info()宏函数,最终以zend_end_arg_info()宏函数结束。如果我们想重写一下php语言中的count()函数,可以: 
zend_function(sample_count_array) 

    zval *arr; 
    if (zend_parse_parameters(zend_num_args() tsrmls_cc, "a",&arr) == failure) 
    { 
        return_null(); 
    } 
    return_long(zend_hash_num_elements(z_arrval_p(arr))); 

zend_parse_parameters()本身可以保证传递过来的参数是一个数组。但是如果我们通过zend_get_parameter()函数来接收参数的话就没这么幸运了,需要我们自己进行类型校对。如果想让内核自动完成类型校对,便需要arg_info上场了: 
    zend_begin_arg_info(php_sample_array_arginfo, 0) 
        zend_arg_array_info(0, arr, 0) 
    zend_end_arg_info() 

.... 
    php_fe(sample_count_array, php_sample_array_arginfo) 
.... 
这样我们便把类型校对的工作交给了zend engine,是不是有种如释重负的感觉!you've also given your argument a name so that the generated error messages can be more meaningful to script writers attempting to use your api. 我们同样可以对参数中的对象进行校验,限制其是继承自某个类或者实现了某个接口等等。 
zend_begin_arg_info(php_sample_class_arginfo, 0) 
    zend_arg_obj_info(1, obj, stdclass, 0) 
zend_end_arg_info() 
需要注意的是,此时第一个参数的值是数字1,代表着以引用的方式传递。其实这个参数对于对象来说几乎没用,因为ze2中所有的对象在当作函数参数的时候都是默认以引用的形式传递的。但是我们又必须把这个参数设置为数字1,除非你不想让你的扩展与php4兼容。在php4中,对象是传递的一个完整copy,而非通过引用。 

对于数组和对象参数,不要忘记最后的允许为null的参数。更多的信息请参考第6章最后一节的有关叙述。 
通过arg info的方式来实现类型绑定的功能只对ze2有效,也就是php5+。如果你想在php4上实现相应的功能,那需要用 zend_get_parameters()函数来接收参数,然后通过z_type_p()宏函数来检测参数的类型或者通过convert_to_type()函数进行类型转换。
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号