php8 fournit un outil très pratique pour générer des informations sur les fonctions d'extension ou les paramètres de classe.
n'a besoin que de conserver une copie de xyz.stub.php
, et vous pouvez utiliser des outils pour générer xyz_arginfo.h
.
Il ne fait aucun doute que cette méthode abaisse le seuil de développement et d'extension pour la majorité de phper
et facilite sa maintenance.
Démarrez l'expérience :
Générez un squelette étendu.
cd ext php ext_skel.php --ext test
Ajoutez une fonction et modifiez test.stub.php
.
<?php /** @generate-function-entries */ function test1(): void {} function test2(string $str = ""): string {} function test3(int $integer = 123): int {}
régénère test_arginfo.h
.
php ../../build/gen_stub.php test.stub.php
Les commits associés peuvent être cliqués ici (https://github.com/php/php-src/compare/master...nikic:php- stubs )
Écrivez un exemple d'extension simple pour implémenter les fonctions all
et any
en python via l'extension PHP.
Préparation.
- Téléchargez le dernier code source de php
- Ayez déjà installé php
Générez le squelette étendu.
cd ext php ext_skel.php --ext python
écrit le prototype de fonction et édite python.stub.php
.
<?php /** @generate-function-entries */ function all(array $arr): bool {} function any(array $arr): bool {}
génère python.stub.php
à partir de python_arginfo.h
.
php ../../build/gen_stub.php python.stub.php
implémente la logique des fonctions, modifiez 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); }
écrit des tests unitaires, édite 002.phpt
et 003.phpt
et crée de nouveaux 004.phpt
et 005.phpt
.
--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)
Compiler, tester et installer
--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)
Ajouter à php.ini
./configure && make make test sudo make install
Rejoindre
php -i | grep ini # 定位你的php.ini文件
Vérifier si cela a réussi
extension=python.so
Test réel
php -m | grep python
PHP8 a ajouté de nombreuses macros et fonctionnalités utiles.