自己动手用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的扩展。

原文链接: https://www.cnblogs.com/moodlxs/archive/2011/09/21/2345383.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/390679

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月30日 下午3:55
下一篇 2023年3月30日 下午3:55

相关推荐