Maison > développement back-end > PHP8 > le corps du texte

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

藏色散人
Libérer: 2023-02-17 11:40:01
avant
3635 Les gens l'ont consulté

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
Copier après la connexion

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 {}
Copier après la connexion

régénère test_arginfo.h.

php ../../build/gen_stub.php test.stub.php
Copier après la connexion

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
Copier après la connexion
écrit le prototype de fonction et édite python.stub.php.
<?php

/** @generate-function-entries */

function all(array $arr): bool {}

function any(array $arr): bool {}
Copier après la connexion
génère python.stub.php à partir de python_arginfo.h.
php ../../build/gen_stub.php python.stub.php
Copier après la connexion
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);
}
Copier après la connexion
é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)
Copier après la connexion
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)
Copier après la connexion
--TEST--
Check any function true case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(any([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]));
var_dump(any([[&#39;a&#39;, &#39;b&#39;, &#39;&#39;, &#39;d&#39;]]));
var_dump(any([[&#39;&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]]));
var_dump(any([[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;&#39;]]));
?>
--EXPECT--
bool(true)
bool(true)
bool(true)
bool(true)
Copier après la connexion
Compiler, tester et installer
--TEST--
Check all function false case
--SKIPIF--
<?php
if (!extension_loaded(&#39;python&#39;)) {
    echo &#39;skip&#39;;
}
?>
--FILE--
<?php
var_dump(any([&#39;0&#39;]));
var_dump(any([0]));
var_dump(any([&#39;&#39;]));
var_dump(any([false]));
var_dump(any([0, &#39;0&#39;, &#39;&#39;, false]));
?>
--EXPECT--
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
Copier après la connexion
Ajouter à php.ini
./configure && make
make test
sudo make install
Copier après la connexion

Rejoindre

php -i | grep ini # 定位你的php.ini文件
Copier après la connexion

Vérifier si cela a réussi

extension=python.so
Copier après la connexion
Test réel
php -m | grep python
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal