php8的扩展arginfo生成工具之使用初体验

藏色散人
Freigeben: 2023-02-17 11:40:01
nach vorne
3404 Leute haben es durchsucht

php8提供了非常方便的扩展函数或类参数信息的生成工具。

只需要维护一份xyz.stub.php,就可以使用工具生成xyz_arginfo.h

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

上手体验:

生成扩展骨架。

cd ext php ext_skel.php --ext test
Nach dem Login kopieren

随便添加一个函数,更改test.stub.php


         
Nach dem Login kopieren

重新生成test_arginfo.h

php ../../build/gen_stub.php test.stub.php
Nach dem Login kopieren

相关 commit 可以 点击这儿(https://github.com/php/php-src/compare/master...nikic:php-stubs)

写个简单的扩展举例,通过php扩展的方式来实现python中的allany函数。

准备工作。
  • 下载php最新源码
  • 已经安装好php
生成扩展骨架。
cd ext php ext_skel.php --ext python
Nach dem Login kopieren
撰写函数原型,编辑python.stub.php

         
Nach dem Login kopieren
根据python.stub.php生成python_arginfo.h
php ../../build/gen_stub.php python.stub.php
Nach dem Login kopieren
实现函数逻辑,编辑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); }
Nach dem Login kopieren
编写单元测试,编辑002.phpt003.phpt, 新建004.phpt005.phpt
--TEST-- Check all function true case --SKIPIF--  --FILE--  --EXPECT-- bool(true) bool(true) bool(true)
Nach dem Login kopieren
--TEST-- Check all function false case --SKIPIF--  --FILE--  --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)
Nach dem Login kopieren
--TEST-- Check any function true case --SKIPIF--  --FILE--  --EXPECT-- bool(true) bool(true) bool(true) bool(true)
Nach dem Login kopieren
--TEST-- Check all function false case --SKIPIF--  --FILE--  --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false)
Nach dem Login kopieren
编译、测试和安装
./configure && make make test sudo make install
Nach dem Login kopieren
加入到php.ini
php -i | grep ini # 定位你的php.ini文件
Nach dem Login kopieren

加入

extension=python.so
Nach dem Login kopieren

查看是否成功

php -m | grep python
Nach dem Login kopieren
实测
php -r "var_dump(all([]));“ php -r "var_dump(any([]));"
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonphp8的扩展arginfo生成工具之使用初体验. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!