我们看一下如何通过其实现类型绑定,但这个特性只能在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,而非通过引用。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号