欢迎访问宙启技术站
智能推送

实例讲解PHP7扩展开发之传参与返回值

发布时间:2023-05-17 13:50:57

PHP是一门非常强大的服务器端脚本语言,提供许多标准的扩展(extension)和功能,使得开发者可以大幅减少开发时间和精力。同时,PHP还支持C/C++扩展动态链接库的形式,允许开发者利用C语言高效的计算能力,从而提高PHP的性能。

本文将通过一个例子,详细讲解PHP7扩展开发过程中的传参及返回值。在此之前,我们需要做一些准备工作,包括安装PHP7运行环境和PHP的C开发环境。安装过程可以参考网络上的相关教程。

首先,我们先来看一个实例,需要实现一个函数,对于输入的一个整型数k,返回一个长度为k的数组,其中每个元素都是k。

<?php
$k = 4;
$res = my_function($k);
print_r($res); // 输出 Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 )

function my_function($k) {
    $res = array();
    for ($i = 0; $i < $k; $i++) {
        $res[$i] = $k;
    }
    return $res;
}
?>

接下来,我们将通过一个简单的例子,来详细讲解PHP7扩展开发过程中的传参及返回值。本例子中需要实现一个函数,对于输入的一个字符串,返回该字符串中所有大写字母的个数。

1. 扩展结构体的定义

我们首先定义一个扩展结构体,用于承载扩展的各种信息。结构体应当包含扩展名称、扩展版本、扩展作者等信息。

static zend_function_entry my_functions[] = {
    PHP_FE(my_count_uppercase, NULL)
    PHP_FE_END
};

zend_module_entry my_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
     STANDARD_MODULE_HEADER,
#endif
    PHP_MY_EXTNAME,
    my_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#if ZEND_MODULE_API_NO >= 20010901
    PHP_MY_VERSION,
#endif
    STANDARD_MODULE_PROPERTIES
};

2. 函数声明

我们在上面的结构体中声明了一个名为 my_count_uppercase 的函数,那么我们需要在扩展的顶层代码中定义该函数,并在头文件中进行声明。

/* my_functions.h */

#ifndef PHP_MY_FUNCTIONS_H
#define PHP_MY_FUNCTIONS_H 1

PHP_FUNCTION(my_count_uppercase);

#endif /* PHP_MY_FUNCTIONS_H */


/* my_functions.c */

PHP_FUNCTION(my_count_uppercase) {    
    /* 函数体 */  
}

3. 参数传递

接下来,我们需要定义该函数的参数传递方式。对于本例子,需要传入一个字符串,因此参数类型为字符串类型(ZEND_ARG_TYPE_INFO),具体定义如下:

const zend_argument_info my_count_uppercase_args[] = {
    ZEND_ARG_INFO(0, str)
    ZEND_ARG_END()
};

在上面的定义中,我们定义了参数 str,并将其传给函数 my_count_uppercase。参数 0 表示这个变量可以作为引用,如果你不想让变量作为引用,可以将其改为 1。

4. 返回值

对于本例子,函数 my_count_uppercase 的返回值为整型类型,因此我们需要使用ZEND_PARSE_PARAMETERS_END宏规定函数返回值类型,并使用RETURN_LONG宏将函数返回值放回函数。

PHP_FUNCTION(my_count_uppercase) {
    char *str;
    size_t str_len;
    long int count = 0;

    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_STRING(str, str_len)
    ZEND_PARSE_PARAMETERS_END();

    for (size_t i = 0; i < str_len; i++) {
        if (isupper(str[i])) {
            count++;
        }
    }

    RETURN_LONG(count);
}

5. 编译安装

最后,我们需要以动态链接库的形式,将扩展安装到PHP运行环境中:

sudo phpize
./configure
make
sudo make install

安装完成后,在PHP配置文件中(php.ini)添加以下配置:

extension=my_functions.so

6. 测试

最后,我们需要测试刚才编写的扩展,来验证其正确性。

<?php
$str = "Hello, World!";
$res = my_count_uppercase($str);
echo "The number of uppercase letters: ", $res;
?>

输出:

The number of uppercase letters: 2

至此,我们完成了一个简单的PHP扩展开发,包括函数传参、返回值和运行测试等基本操作。当然,PHP7扩展的开发还包括很多更高级的操作,如异常处理(try/catch)、数组处理(array)等,这些可参考PHP官方手册,也可以通过各种方法自行探索。