作者: 黄浩
网名: 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