PHP内核介绍及扩展开发指南——Extensions 的编写:返回值

2012-11-28 12:19 阅读 521 次 评论关闭

目录

一、基础知识

PHP内核介绍及扩展开发指南——基础知识:PHP变量的存储

PHP内核介绍及扩展开发指南——基础知识:HashTable结构

二、Extensions 的编写

PHP内核介绍及扩展开发指南——Extensions 的编写:Hello World

PHP内核介绍及扩展开发指南——Extensions 的编写:使用参数

 

从C函数向PHP返回值,并不能使用通常的return语句,导出函数的原型也说明了这一点:

void zif_first_module (

int ht,

zval * return_value,

zval **return_value_ptr,

zval * this_ptr,

int return_value_used

);

因此,Zend将返回值地址作为参数传给我们,return_value是Zend为我们预先创建的一个标准zval结构,相当于一个局部变量,用户获得返回值时就相当于对return_value进行赋值操作,我们只需填充它即可;return_value_used表明用户是否使用了返回值,0表明没有使用返回值,当函数结束后return_value的refcount将被减为0,并被销毁,因此,这种情况下完全可以不处理返回值;return_value_ptr用于返回引用,它需要和zend_function_entry.arg_info联合使用,通常都是NULL。

Zend提供了一组宏用于填充return_value:

 

Macro

Description
RETURN_RESOURCE(resource) resource
RETURN_BOOL(bool) boolean
RETURN_FALSE false
RETURN_TRUE true
RETURN_NULL() NULL
RETURN_LONG(long) long
RETURN_DOUBLE(double) double
RETURN_STRING(string, duplicate) 字符串。string必须是C串,因为Zend将调用strlen();duplicate表示是否将传入的C串复制一份再赋给zval,如果传入的C串不是用Zend例程分配的,应该指定该值
RETURN_STRINGL(string, length, duplicate) 指定字符串长度,而不是使用strlen()
RETURN_EMPTY_STRING() 空字符串

 

这些宏将在填充完return_value后,执行return语句。如果不想return,可以改用相应RETURN_xxx宏的RETVAL_xxx版本。

2.2.1   返回引用

默认情况下,return_value_ptr是NULL,而当指定返回引用后(参见2.2.4),zend将采用*return_value_ptr作为返回值。初始状态下,return_value 依然指向一个临时zval,同时 *return_value_ptr = return_value。

通常应该把return_value销毁,并且将*return_value_ptr设为将要返回的zval*,注意要加加引用计数,因为这相当于将该zval赋值给一个用作返回值的临时变量,函数返回后,Zend会减减引用计数。

示例程序:

ZEND_FUNCTION(str_reverse)

{

    if(ZEND_NUM_ARGS()!= 1)

        WRONG_PARAM_COUNT;

    zval **args;

if(zend_get_parameters_array_ex(ZEND_NUM_ARGS(), &args TSRMLS_CC)

 == FAILURE)

    {

        return;

    }

    convert_to_string(*args);

    char swap;

    char *head = Z_STRVAL_PP(args);

    char *end = head + Z_STRLEN_PP(args) - 1;

    for(; head < end; ++head, --end)

    {

        swap = *end;

        *end = *head;

        *head = swap;

}

// 销毁临时zval

zval_ptr_dtor(return_value_ptr);

// 返回传入的参数

*return_value_ptr = *args;

// 增加引用计数

++(*return_value_ptr)->refcount;

}

下载专辑 

PHP内核介绍及扩展开发指南.doc

 

编写 PHP Extension

zhangdongjin@baidu.com

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:PHP内核介绍及扩展开发指南——Extensions 的编写:返回值 | 猎微网

评论已关闭!