php8扩展arginfo生成工具及工具初体验介绍
发布:smiling 来源: PHP粉丝网 添加日期:2023-10-06 18:05:44 浏览: 评论:0
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新增了蛮多有用的宏和特性。
Tags: php8生成工具 arginfo
- 上一篇:php5.6不能扩展redis.so的解决方法
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)