您的位置:首页 > 编程语言 > PHP开发

自己动手用C扩展PHP(二)

2011-09-21 13:39 295 查看
在上一章里我们介绍了如何编写自己的函数,接下来,我们开始编写一个有参数有返回值的扩展函数。

因为Zend没有正式的函数调用语法检查支持,所以我们在编写扩展函数的时候必须得“小心”,也就是我们必须得严格地进行调用合法性检查。首先,我们写一个函数:

#include "string.h"

PHP_FUNCTION(haosoft_strcat)

{

char* pc_arg_one = NULL;

char* pc_arg_tow = NULL;

long arg_one_len;

long arg_tow_len;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &pc_arg_one, &arg_one_len, &pc_arg_tow, &arg_tow_len) == FAILURE)

{

return;

}

RETURN_STRINGL(strcat(pc_arg_one, pc_arg_tow), (arg_one_len + arg_tow_len), 1);

}

我们来分析这个函数:

1:

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &pc_arg_one, &arg_one_len, &pc_arg_tow, &arg_tow_len) == FAILURE)

{

return;

}

这句就是进行参数检查与取得参数的语句,zend_parse_parameters()是Zend提供的API函数,第一个参数是参数的数量,可以通过Zend提供的ZEND_NUM_ARGS()来取得,TSRMLS_CC是必须的,第三个参数“ss”指明参数的类型(s - 字符串),这个函数有2个字符串参数,所以为“ss”,之后的参数就是你要取得的参数值了。注意:如果参数类型为“s”的话,参数值后面还要传一个long来取得字符串的长度。

zend_parse_parameters函数成功的话会返回SUCCESS,失败则返回FAILURE,并且输出错误信息。

2:

RETURN_STRINGL(strcat(pc_arg_one, pc_arg_tow), (arg_one_len + arg_tow_len), 1);

这句的作用是返回一个值,RETURN_STRINGL()为返回字符串,详细信息可以参阅Zend API参考手册。这句作用是连接两个字符串参数并返回。

编译好扩展模块后,现在我们可以在 php 里调用这个函数

<?php

$s_result = haosoft_strcat("a", "b");

echo $s_result;

?>

输出:ab

说明:函数参数类型指定字符表,和一些返回函数返回值的函数可以参阅Zend文档,这里就不列出了。因为Zend API说明文档不完全,许多Macro及大多数Zend API函数都没有详细说明。呵呵,所以如有错误地方,欢迎指正。

今天查阅了些Zend的资料,用C++写了一下PHP的扩展,觉得真的非常麻烦,一个只有一个MyClass::GetString()方法的类,要实现在php里:

<?php

$obj = new MyClass();

$string = $obj->GetString();

?>

写了好几百行代码,对于习惯面向对象形式编程的人简直是噩梦,希望Zend能在这方面改善一下了,等有时间我会再写写如何用C++编写PHP的扩展。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: