|
正文
php8提供了非常方便的扩展函数或类参数信息的生成工具。
只需要维护一份,就可以使用工具生成。
毫无疑问,这种方式,又降低了广大开发扩展的门槛,更易维护。
上手体验
生成扩展骨架。- cd ext
- php ext_skel.php --ext test
复制代码 随便添加一个函数,更改。- <?php
- /** @generate-function-entries */
- function test1(): void {}
- function test2(string $str = ""): string {}
- function test3(int $integer = 123): int {}
复制代码 重新生成。- php ../../build/gen_stub.php test.stub.php
复制代码 相关 commit 可以 点击这儿
写个简单的扩展举例,通过php扩展的方式来实现python中的和函数。
准备工作
生成扩展骨架
- cd ext
- php ext_skel.php --ext python
复制代码 撰写函数原型
编辑。- <?php
- /** @generate-function-entries */
- function all(array $arr): bool {}
- function any(array $arr): bool {}
复制代码 根据生成。- php ../../build/gen_stub.php python.stub.php
复制代码 实现函数逻辑
编辑。- 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);
- }
复制代码 编写单元测试
编辑和, 新建和。- --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.ini
- php -i | grep ini # 定位你的php.ini文件
复制代码 加入查看是否成功实测
- php -r "var_dump(all([]));“
- php -r "var_dump(any([]));"
复制代码 PHP8新增了蛮多有用的宏和特性。
以上就是php8扩展arginfo生成工具及工具初体验介绍的详细内容,更多关于php8扩展arginfo生成工具的资料请关注脚本之家其它相关文章!
来源:https://www.jb51.net/program/290536mnp.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|