当前位置:首页 > PHP教程 > php环境安装 > 列表

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。

  1. <?php 
  2. /** @generate-function-entries */ 
  3. function test1(): void {} 
  4. function test2(string $str = ""): string {} 
  5. 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。

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

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

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

实现函数逻辑

编辑 python.c。

  1. PHP_FUNCTION(all) 
  2.     zval *input; 
  3.     zval *item; 
  4.     int result = 1, item_result = 1; 
  5.     HashTable *htbl; 
  6.     ZEND_PARSE_PARAMETERS_START(1, 1) 
  7.         Z_PARAM_ARRAY(input) 
  8.     ZEND_PARSE_PARAMETERS_END(); 
  9.     htbl = Z_ARRVAL_P(input); 
  10.     ZEND_HASH_FOREACH_VAL(htbl, item) { 
  11.         item_result = zend_is_true(item); 
  12.         result &= item_result; 
  13.     } ZEND_HASH_FOREACH_END(); 
  14.     RETURN_BOOL(result); 
  15. /* {{{ void any() */ 
  16. PHP_FUNCTION(any) 
  17.     zval *input; 
  18.     zval *item; 
  19.     int result = 0, item_result = 0; 
  20.     HashTable *htbl; 
  21.     ZEND_PARSE_PARAMETERS_START(1, 1) 
  22.         Z_PARAM_ARRAY(input) 
  23.     ZEND_PARSE_PARAMETERS_END(); 
  24.     htbl = Z_ARRVAL_P(input); 
  25.     ZEND_HASH_FOREACH_VAL(htbl, item) { 
  26.         item_result = zend_is_true(item); 
  27.         result |= item_result; 
  28.     } ZEND_HASH_FOREACH_END(); 
  29.     RETURN_BOOL(result); 

编写单元测试

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

  1. --TEST-- 
  2. Check all function true case 
  3. --SKIPIF-- 
  4. <?php 
  5. if (!extension_loaded('python')) { 
  6.     echo 'skip'
  7. ?> 
  8. --FILE-- 
  9. <?php 
  10. var_dump(all([])); 
  11. var_dump(all([1])); 
  12. var_dump(all([-1, 1, '1'])); 
  13. ?> 
  14. --EXPECT-- 
  15. bool(true) 
  16. bool(true) 
  17. bool(true) 
  18. --TEST-- 
  19. Check all function false case 
  20. --SKIPIF-- 
  21. <?php 
  22. if (!extension_loaded('python')) { 
  23.     echo 'skip'
  24. ?> 
  25. --FILE-- 
  26. <?php 
  27. var_dump(all(['0'])); 
  28. var_dump(all([0])); 
  29. var_dump(all([''])); 
  30. var_dump(all([false])); 
  31. var_dump(all([1, -1, 100, false])); 
  32. var_dump(all([0, -1, 100, 1])); 
  33. var_dump(all(['1', -1, '', 100, 1])); 
  34. ?> 
  35. --EXPECT-- 
  36. bool(false) 
  37. bool(false) 
  38. bool(false) 
  39. bool(false) 
  40. bool(false) 
  41. bool(false) 
  42. bool(false) 
  43. --TEST-- 
  44. Check any function true case 
  45. --SKIPIF-- 
  46. <?php 
  47. if (!extension_loaded('python')) { 
  48.     echo 'skip'
  49. ?> 
  50. --FILE-- 
  51. <?php 
  52. var_dump(any(['a''b''c''d'])); 
  53. var_dump(any([['a''b''''d']])); 
  54. var_dump(any([['''b''c''d']])); 
  55. var_dump(any([['a''b''c''']])); 
  56. ?> 
  57. --EXPECT-- 
  58. bool(true) 
  59. bool(true) 
  60. bool(true) 
  61. bool(true) 
  62. --TEST-- 
  63. Check all function false case 
  64. --SKIPIF-- 
  65. <?php 
  66. if (!extension_loaded('python')) { 
  67.     echo 'skip'
  68. ?> 
  69. --FILE-- 
  70. <?php 
  71. var_dump(any(['0'])); 
  72. var_dump(any([0])); 
  73. var_dump(any([''])); 
  74. var_dump(any([false])); 
  75. var_dump(any([0, '0''', false])); 
  76. ?> 
  77. --EXPECT-- 
  78. bool(false) 
  79. bool(false) 
  80. bool(false) 
  81. bool(false) 
  82. 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

分享到: