LY’Blog~~blog.ly5.org~~ Rotating Header Image

[转]自己动手用 C 扩展 PHP(二)- 函数

作者: 黄浩
网名: black_key or ROOT1
mail: kkk139@126.com
转自: 开发者俱乐部 http://www.dev-club.com

引言:
有感于大多数人认为 PHP 只是一种弱类型,只能做小型web应用的脚本语言。 与目前的Java, .Net平台有一定的差距,所以决定写一些 PHP 的扩展方法文章,我相信
我们PHPER们通过自己动手写商业扩展,一定能构建出强大的,极速的Web应用,因为扩展本身就是编译型语言编写的(c/c++),而且可以
预先驻留内存的(Apache启动时加载),有了 C/C++ 编写的扩展,我们几乎可以无所不能.
呵呵,Zend 的说明文档少之又少,真令人头疼 :)
--------------------------------------------------------

在 上一章 自己动手用 C 扩展 PHP(一)里我们介绍了
如何编写自己的函数,接下来,我们开始编写一个有参数
有返回值的扩展函数。

因为 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的扩展。

待续 …

0 Comments on “[转]自己动手用 C 扩展 PHP(二)- 函数”

Leave a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word