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.iniphp -i | grep ini # 定位你的php.ini文件

加入extension=python.so

查看是否成功php -m | grep python

实测php -r "var_dump(all([]));“

php -r "var_dump(any([]));"

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

python与php8-php8的扩展arginfo生成工具及工具初体验相关推荐

  1. 生成dump文件需要多久_php8的扩展arginfo生成工具

    内容参考自:思否 php8提供了非常方便的扩展函数或类参数信息的生成工具. 只需要维护一份xyz.stub.php,就可以使用工具生成 xyz_arginfo.h. 毫无疑问,这种方式,又降低了广大  ...

  2. python贴吧数据可视化软件_Python数据可视化工具之Pyecharts初体验

    前言 之前采集了我爱我家的13000多条租房信息,准备做下数据分析,也了解到Pyecharts这个可视化工具,于是上手试了一番 pyecharts 是一个用于生成 Echarts 图表的类库.Echa ...

  3. Python PyInstaller 安装 和 使用教程( 打包生成 exe )

    From:http://c.biancheng.net/view/2690.html Python zipapp打包教程:http://c.biancheng.net/view/2687.html 在 ...

  4. ChromeDriver/Selenium/Python浏览器自动化初体验

    目录 ChromeDriver安装 Selenium安装 Python脚本 ChromeDriver安装 在浏览器地址栏输入,查看chrome当前版本: chrome://version 在浏览器地址 ...

  5. 这个插件竟打通了Python和Excel,还能自动生成代码!

    作者 | 云朵君 来源丨数据STUDIO 加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用E ...

  6. python自动测试g_Python自动化测试如何自动生成测试用例?

    原文作者:陈安妮annie1 原出处:简书 上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰,我们将立即处理.传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言判断是 ...

  7. 2021-02-06 Python通过matplotlib包和gif包生成gif动画

    Python通过matplotlib包和gif包生成gif动画 使用matplotlib生成gif动画的方法有很多,一般常规使用matplotlib的animation模块的FuncAnimation ...

  8. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  9. 【Python】这个插件竟打通了Python和Excel,还能自动生成代码!

    加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用Excel一样简单: 介绍 以 Excel ...

最新文章

  1. NODEJS 使用 XLSX模块导出excel文件
  2. Byte和bit的区别?
  3. 设计一个有getMin功能的栈 (python)
  4. struts实战--实现条件查询(利用dbutils)
  5. C++ 的多态性与虚函数
  6. Angular变化检测机制:改善的脏检查
  7. Adaboost算法原理分析和实例+代码(转载)
  8. Hello Blazor:(2)集成Tailwind CSS续——nuget包方式
  9. lua transliterate实现(lua程序设计10.6练习10.3题)
  10. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...
  11. 分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例
  12. spark指定python版本_1.Spark学习(Python版本):Spark安装
  13. (54)Verilog HDL下升沿采样
  14. python简单代码-代码的重试机制(python简单实现)
  15. Bitbucket 触发内网 Jenkins Build
  16. 一天搞懂深度学习(李宏毅)-学习笔记
  17. 关于kgm文件的解码
  18. 完美解决failed to open stream: HTTP request failed!(file_get_contents引起的)
  19. 什么是OLAP?主流八大开源OLAP技术架构对比
  20. 92-Kafka详解

热门文章

  1. POJ 1177 Picture [离散化+扫描线+线段树]
  2. jquery动态加载问题
  3. Delphi Excel操作,写了个ADODataSet转Excel的函数作为后期学习的例子
  4. 块级元素内联并列显示
  5. Google Map API 学习六-设置infoWindow的长宽
  6. R向量化操作(Data Transformations)
  7. MAC安装iterm2及配置
  8. Git,Github和Gitlab简介和基本使用
  9. mybatis配置ehcache缓存
  10. 对象的比较与排序(三):实现IComparableT和IComparerT泛型接口