Maison  >  Article  >  développement back-end  >  Première expérience d'utilisation de l'outil de génération d'arginfo étendu de PHP8

Première expérience d'utilisation de l'outil de génération d'arginfo étendu de PHP8

藏色散人
藏色散人avant
2020-09-16 17:03:163622parcourir

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(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(all([]));
var_dump(all([1]));
var_dump(all([-1, 1, &#39;1&#39;]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
rrree
--TEST--
Check all function false case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(all([&#39;0&#39;]));
var_dump(all([0]));
var_dump(all([&#39;&#39;]));
var_dump(all([false]));
var_dump(all([1, -1, 100, false]));
var_dump(all([0, -1, 100, 1]));
var_dump(all([&#39;1&#39;, -1, &#39;&#39;, 100, 1]));
?>
--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)
Compiler, tester et installer
--TEST--
Check all function false case
--SKIPIF--
03337722efea1711f56b8de85a57c3f3
--FILE--
adcfae2c6b929629deb6b746091dd12c
--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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer