翼度科技»论坛 编程开发 PHP 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
正文

php8提供了非常方便的扩展函数或类参数信息的生成工具。
只需要维护一份
  1. xyz.stub.php
复制代码
,就可以使用工具生成
  1. xyz_arginfo.h
复制代码

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

上手体验

生成扩展骨架。
  1. cd ext
  2. php ext_skel.php --ext test
复制代码
随便添加一个函数,更改
  1. test.stub.php
复制代码
  1. <?php
  2. /** @generate-function-entries */
  3. function test1(): void {}
  4. function test2(string $str = ""): string {}
  5. function test3(int $integer = 123): int {}
复制代码
重新生成
  1. test_arginfo.h
复制代码
  1. php ../../build/gen_stub.php test.stub.php
复制代码
相关 commit 可以 点击这儿
写个简单的扩展举例,通过php扩展的方式来实现python中的
  1. all
复制代码
  1. any
复制代码
函数。

准备工作


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

生成扩展骨架
  1. cd ext
  2. php ext_skel.php --ext python
复制代码
撰写函数原型

编辑
  1. python.stub.php
复制代码
  1. <?php
  2. /** @generate-function-entries */
  3. function all(array $arr): bool {}
  4. function any(array $arr): bool {}
复制代码
根据
  1. python.stub.php
复制代码
生成
  1. python_arginfo.h
复制代码
  1. php ../../build/gen_stub.php python.stub.php
复制代码
实现函数逻辑

编辑
  1. python.c
复制代码
  1. PHP_FUNCTION(all)
  2. {
  3.     zval *input;
  4.     zval *item;
  5.     int result = 1, item_result = 1;
  6.     HashTable *htbl;
  7.     ZEND_PARSE_PARAMETERS_START(1, 1)
  8.         Z_PARAM_ARRAY(input)
  9.     ZEND_PARSE_PARAMETERS_END();
  10.     htbl = Z_ARRVAL_P(input);
  11.     ZEND_HASH_FOREACH_VAL(htbl, item) {
  12.         item_result = zend_is_true(item);
  13.         result &= item_result;
  14.     } ZEND_HASH_FOREACH_END();
  15.     RETURN_BOOL(result);
  16. }
  17. /* {{{ void any() */
  18. PHP_FUNCTION(any)
  19. {
  20.     zval *input;
  21.     zval *item;
  22.     int result = 0, item_result = 0;
  23.     HashTable *htbl;
  24.     ZEND_PARSE_PARAMETERS_START(1, 1)
  25.         Z_PARAM_ARRAY(input)
  26.     ZEND_PARSE_PARAMETERS_END();
  27.     htbl = Z_ARRVAL_P(input);
  28.     ZEND_HASH_FOREACH_VAL(htbl, item) {
  29.         item_result = zend_is_true(item);
  30.         result |= item_result;
  31.     } ZEND_HASH_FOREACH_END();
  32.     RETURN_BOOL(result);
  33. }
复制代码
编写单元测试

编辑
  1. 002.phpt
复制代码
  1. 003.phpt
复制代码
, 新建
  1. 004.phpt
复制代码
  1. 005.phpt
复制代码
  1. --TEST--
  2. Check all function true case
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded('python')) {
  6.     echo 'skip';
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. var_dump(all([]));
  12. var_dump(all([1]));
  13. var_dump(all([-1, 1, '1']));
  14. ?>
  15. --EXPECT--
  16. bool(true)
  17. bool(true)
  18. bool(true)
复制代码
  1. --TEST--
  2. Check all function false case
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded('python')) {
  6.     echo 'skip';
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. var_dump(all(['0']));
  12. var_dump(all([0]));
  13. var_dump(all(['']));
  14. var_dump(all([false]));
  15. var_dump(all([1, -1, 100, false]));
  16. var_dump(all([0, -1, 100, 1]));
  17. var_dump(all(['1', -1, '', 100, 1]));
  18. ?>
  19. --EXPECT--
  20. bool(false)
  21. bool(false)
  22. bool(false)
  23. bool(false)
  24. bool(false)
  25. bool(false)
  26. bool(false)
复制代码
  1. --TEST--
  2. Check any function true case
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded('python')) {
  6.     echo 'skip';
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. var_dump(any(['a', 'b', 'c', 'd']));
  12. var_dump(any([['a', 'b', '', 'd']]));
  13. var_dump(any([['', 'b', 'c', 'd']]));
  14. var_dump(any([['a', 'b', 'c', '']]));
  15. ?>
  16. --EXPECT--
  17. bool(true)
  18. bool(true)
  19. bool(true)
  20. bool(true)
复制代码
  1. --TEST--
  2. Check all function false case
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded('python')) {
  6.     echo 'skip';
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. var_dump(any(['0']));
  12. var_dump(any([0]));
  13. var_dump(any(['']));
  14. var_dump(any([false]));
  15. var_dump(any([0, '0', '', false]));
  16. ?>
  17. --EXPECT--
  18. bool(false)
  19. bool(false)
  20. bool(false)
  21. bool(false)
  22. bool(false)
复制代码
编译、测试和安装
  1. ./configure && make
  2. make test
  3. sudo make install
复制代码
加入到php.ini
  1. php -i | grep ini # 定位你的php.ini文件
复制代码
加入
  1. extension=python.so
复制代码
查看是否成功
  1. php -m | grep python
复制代码
实测
  1. php -r "var_dump(all([]));“
  2. php -r "var_dump(any([]));"
复制代码
PHP8新增了蛮多有用的宏和特性。
以上就是php8扩展arginfo生成工具及工具初体验介绍的详细内容,更多关于php8扩展arginfo生成工具的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/290536mnp.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具