当前位置:首页 > 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. { 
  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. } 

编写单元测试

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

分享到: