首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

[通译][php扩展和嵌入式]第6章-返回值

2013-03-01 
[翻译][php扩展和嵌入式]第6章-返回值本书目前在github上由laruence(http://www.laruence.com)和walu(http

[翻译][php扩展和嵌入式]第6章-返回值

本书目前在github上由laruence(http://www.laruence.com)和walu(http://www.walu.cc)两位大牛组织翻译. 该翻译项目地址为: https://github.com/walu/phpbook

本书在github上的地址: https://github.com/goosman-lei/php-eae

未来本书将可能部分合并到phpbook项目中, 同时保留一份独立版本.


原书名: <Extending and Embedding PHP>

原作者: Sara Golemon

译者: goosman.lei(雷果国)

译者Email: lgg860911@yahoo.com.cn

译者Blog: http://blog.csdn.net/lgg201

返回值

用户空间函数利用return关键字向它的调用空间回传信息, 这一点和C语言的语法相同.

例如:

普通的ZVAL

return_value专用宏

ZVAL_NULL(return_value)

RETVAL_NULL()

ZVAL_BOOL(return_value, bval)

RETVAL_BOOL(bval)

ZVAL_TRUE(return_value)

RETVAL_TRUE

ZVAL_FALSE(return_value)

RETVAL_FALSE

ZVAL_LONG(return_value, lval)

RETVAL_LONG(lval)

ZVAL_DOUBLE(return_value, dval)

RETVAL_DOUBLE(dval)

ZVAL_STRING(return_value, str, dup)

RETVAL_STRING(str, dup)

ZVAL_STRINGL(return_value, str, len, dup)

RETVAL_STRINGL(str, len, dup)

ZVAL_RESOURCE(return_value, rval)

RETVAL_RESOURCE(rval)


要注意到, TRUE和FALSE宏没有括号. 这是考虑到了Zend/PHP代码标准的偏差, 保留了主要的一种以保持向后兼容. 如果你构建扩展失败, 收到了错误消息undefined macro RETVAL_TRUE(), 请确认你是否在代码中写这两个宏时误写了括号.

通常, 在你的函数处理返回值的时候, 它已经准备好退出并将控制返回给调用作用域了. 由于这个原因, 为内部函数设计了另外一些宏用于返回: RETURN_*()族宏.

标记类型

含义

BYREF_NONE

这个参数永远都不允许引用传值.尝试使用调用时引用传值将被忽略,参数仍然会被拷贝.

BYREF_FORCE

参数永远都是引用传值,无论怎样调用.这等价于在用户空间函数定义时使用取地址符(&)

BYREF_ALLOW

参数是否引用传值取决于调用时的语义.这等价于普通的用户空间函数定义.

BYREF_FORCE_REST

当前参数以及后面所有参数都将应用BYREF_FORCE.这个标记只能作为列表的最后一个标记.在BYREF_FORCE_REST后面放置其他标记可能导致未定义行为.


在Zend引擎2(php 5+)中, 你将使用一种更加可扩展的结构, 它包含类更多的信息, 比如最小和最大参数要求, 类型暗示, 是否强制引用等.

首先, 参数信息结构使用两个宏中的一个定义. 较简单的一个是ZEND_BEGIN_ARG_INFO(), 它需要两个参数:

用途

ZEND_ARG_PASS_INFO(by_ref)

by_ref和所有后面的宏一样是一个二选一的选项,它用来标识是否对应的参数应该被强制为引用传值.设置这个选项为1等同于在Zend引擎1中使用BYREF_FORCE.

ZEND_ARG_INFO(by_ref, name)

这个宏提供了一个附加的name属性,用于内部生成的错误消息和反射API.它应该被设置成一些非加密的帮助信息.

ZEND_ARG_ARRAY_INFO(by_ref, name, allow_null)

这两个宏提供了内部函数的参数类型暗示,用来描述参数只能是数组或某个特定类型的实例.将allow_null设置为非0值将允许调用时在放置array/object的地方传递NULL值.

ZEND_ARG_OBJ_INFO(by_ref, name, classname, allow_null)


最后, 所有使用Zend引擎2的宏设置的参数信息结构必须使用ZEND_END_ARG_INFO()结束. 对于你的sample函数, 你需要选择一个如下的结构:

PHP_FALIAS(sample_byref_compiletime, sample_byref_calltime,    php_sample_byref_arginfo)

回顾第5章, 这将创建一个名为sample_byref_compiletime()的用户空间函数, 它对应的内部实现是sample_byref_calltime()的代码. php_sample_byref_arginfo是这个版本的特殊之处.

小结

本章你看到了怎样从一个内部函数返回值, 包括直接返回值和引用方式返回, 以及通过参数栈引用返回. 此外还简单了解了Zend引擎2的参数类型暗示结构zend_arg_info.

下一章你将会继续探究接受基本的zval参数以及使用zend_parse_parameters()强大的类型戏法.


目录上一章: 您的第一个扩展
下一章: 待续

热点排行