php8 provides a very convenient tool for generating extension function or class parameter information.
You only need to maintain a copy ofxyz.stub.php
, and you can use tools to generatexyz_arginfo.h
.
There is no doubt that this method lowers the threshold for the development and extension ofphper
and makes it easier to maintain.
Get started experience:
Generate extended skeleton.
cd ext php ext_skel.php --ext test
Add a function and changetest.stub.php
.
Regenerate
test_arginfo.h
.php ../../build/gen_stub.php test.stub.phpRelated commits can be clicked here (https://github.com/php/php-src/compare/master...nikic:php-stubs )
Write a simple extension example to implement the
all
andany
functions in python through PHP extension.Preparation.
- Download the latest source code of php
- Already installed php
Generate the extended skeleton.
cd ext php ext_skel.php --ext python
Write the function prototype and editpython.stub.php
.
Generate
python_arginfo.h
based onpython.stub.php
.php ../../build/gen_stub.php python.stub.phpTo implement function logic, edit
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); }Write unit tests, edit
002.phpt
and003.phpt
, create new004.phpt
and005.phpt
.--TEST-- Check all function true case --SKIPIF-- --FILE-- --EXPECT-- bool(true) bool(true) bool(true)--TEST-- Check all function false case --SKIPIF-- --FILE-- --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)--TEST-- Check any function true case --SKIPIF-- 03337722efea1711f56b8de85a57c3f3 --FILE-- 9aca998af19012e49a0511600d6999f0 --EXPECT-- bool(true) bool(true) bool(true) bool(true)--TEST-- Check all function false case --SKIPIF-- 03337722efea1711f56b8de85a57c3f3 --FILE-- adcfae2c6b929629deb6b746091dd12c --EXPECT-- bool(false) bool(false) bool(false) bool(false) bool(false)Compile, test and install
./configure && make make test sudo make installAdd to php.ini
php -i | grep ini # 定位你的php.ini文件Join
extension=python.soCheck if successful
php -m | grep pythonActual test
php -r "var_dump(all([]));“ php -r "var_dump(any([]));"PHP8 has added a lot of useful macros and features.