php8扩展arginfo生成工具及工具初体验介绍

2023-12-05 0 748
目录
  • 正文
  • 上手体验
    • 准备工作
    • 生成扩展骨架
    • 撰写函数原型
    • 实现函数逻辑
    • 编写单元测试
  • 编译、测试和安装
    • 加入到php.ini
    • 实测

正文

php8提供了非常方便的扩展函数或类参数信息的生成工具。

只需要维护一份xyz.stub.php,就可以使用工具生成xyz_arginfo.h。

毫无疑问,这种方式,又降低了广大phper开发扩展的门槛,更易维护。

上手体验

生成扩展骨架。

cd ext
php ext_skel.php –ext test

随便添加一个函数,更改test.stub.php。

<?php
/** @generate-function-entries */
function test1(): void {}
function test2(string $str = \”\”): string {}
function test3(int $integer = 123): int {}

重新生成test_arginfo.h。

php ../../build/gen_stub.php test.stub.php

相关 commit 可以点击这儿

写个简单的扩展举例,通过php扩展的方式来实现python中的all和any函数。

准备工作

  • 下载php最新源码
  • 已经安装好php

生成扩展骨架

cd ext
php ext_skel.php –ext python

撰写函数原型

编辑python.stub.php。

<?php
/** @generate-function-entries */
function all(array $arr): bool {}
function any(array $arr): bool {}

根据python.stub.php生成python_arginfo.h。

php ../../build/gen_stub.php python.stub.php

实现函数逻辑

编辑python.c。

PHP_FUNCTION(all)
{
zval *input;
zval *item;
int result = 1, item_result = 1;
HashTable *htbl;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ARRAY(input)
ZEND_PARSE_PARAMETERS_END();
htbl = Z_ARRVAL_P(input);
ZEND_HASH_FOREACH_VAL(htbl, item) {
item_result = zend_is_true(item);
result &= item_result;
} ZEND_HASH_FOREACH_END();
RETURN_BOOL(result);
}
/* {{{ void any() */
PHP_FUNCTION(any)
{
zval *input;
zval *item;
int result = 0, item_result = 0;
HashTable *htbl;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ARRAY(input)
ZEND_PARSE_PARAMETERS_END();
htbl = Z_ARRVAL_P(input);
ZEND_HASH_FOREACH_VAL(htbl, item) {
item_result = zend_is_true(item);
result |= item_result;
} ZEND_HASH_FOREACH_END();
RETURN_BOOL(result);
}

编写单元测试

编辑002.phpt和003.phpt, 新建004.phpt和005.phpt。

–TEST–
Check all function true case
–SKIPIF–
<?php
if (!extension_loaded(\’python\’)) {
echo \’skip\’;
}
?>
–FILE–
<?php
var_dump(all([]));
var_dump(all([1]));
var_dump(all([-1, 1, \’1\’]));
?>
–EXPECT–
bool(true)
bool(true)
bool(true)
–TEST–
Check all function false case
–SKIPIF–
<?php
if (!extension_loaded(\’python\’)) {
echo \’skip\’;
}
?>
–FILE–
<?php
var_dump(all([\’0\’]));
var_dump(all([0]));
var_dump(all([\’\’]));
var_dump(all([false]));
var_dump(all([1, -1, 100, false]));
var_dump(all([0, -1, 100, 1]));
var_dump(all([\’1\’, -1, \’\’, 100, 1]));
?>
–EXPECT–
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
–TEST–
Check any function true case
–SKIPIF–
<?php
if (!extension_loaded(\’python\’)) {
echo \’skip\’;
}
?>
–FILE–
<?php
var_dump(any([\’a\’, \’b\’, \’c\’, \’d\’]));
var_dump(any([[\’a\’, \’b\’, \’\’, \’d\’]]));
var_dump(any([[\’\’, \’b\’, \’c\’, \’d\’]]));
var_dump(any([[\’a\’, \’b\’, \’c\’, \’\’]]));
?>
–EXPECT–
bool(true)
bool(true)
bool(true)
bool(true)
–TEST–
Check all function false case
–SKIPIF–
<?php
if (!extension_loaded(\’python\’)) {
echo \’skip\’;
}
?>
–FILE–
<?php
var_dump(any([\’0\’]));
var_dump(any([0]));
var_dump(any([\’\’]));
var_dump(any([false]));
var_dump(any([0, \’0\’, \’\’, false]));
?>
–EXPECT–
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)

编译、测试和安装

./configure && make
make test
sudo make install

加入到php.ini

php -i | grep ini # 定位你的php.ini文件

加入

extension=python.so

查看是否成功

php -m | grep python

实测

php -r \”var_dump(all([]));“
php -r \”var_dump(any([]));\”

PHP8新增了蛮多有用的宏和特性。

以上就是php8扩展arginfo生成工具及工具初体验介绍的详细内容,更多关于php8扩展arginfo生成工具的资料请关注悠久资源网其它相关文章!

您可能感兴趣的文章:

  • PHP实现动态表单生成工具详解
  • Thinkphp自定义代码生成工具及用法说明(附下载地址)
  • PHP的bz2压缩扩展工具详解
  • 七种PHP开发环境搭建工具
  • PHP实现统计代码行数小工具
  • PHP实现微信小程序用户授权的工具类示例

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 PHP php8扩展arginfo生成工具及工具初体验介绍 https://www.u-9.cn/biancheng/php/94792.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务