Maison > développement back-end > tutoriel php > Apprentissage de base de l'extension PHP

Apprentissage de base de l'extension PHP

小云云
Libérer: 2023-03-19 16:24:01
original
1585 Les gens l'ont consulté

Cet article vous présente principalement l'écriture d'extensions PHP à partir de zéro. Nous commencerons par comment générer une extension PHP. J'espère que cela pourra vous aider.

PHP est écrit en langage C. Pour chaque PHPer, il existe une envie intérieure d’écrire des extensions. Cependant, il manque un bon point d’entrée. Lors de la recherche sur le développement d'extensions PHP sur Google, la plupart d'entre eux sont des articles copiés, et certaines personnes les ont même publiés sur leurs blogs sans même les exploiter. Il existe cependant plusieurs bons tutoriels, mais ils sont tous des produits de l’ère PHP 5 et comportent de nombreux pièges cachés. J'enregistrerai le processus consistant à marcher lentement sur la fosse, et peut-être que cela deviendra un « tutoriel » pour d'autres.

Générer une extension

Je pense que beaucoup de gens ont vu de nombreux tutoriels en ligne. La plupart d'entre eux nous apprennent à exécuter cette commande : $./ext_skel--extname=extname. Cependant, lorsque vous clonez le code source PHP, vous constaterez qu'il n'y a pas de fichier ext/ext_skel sous la branche master. Donc, je l'ai résumé :

Si vous téléchargez directement le code source de PHP, ou sous la version publiée, vous pouvez exécuter cette commande

$ cd ext
$ ./ext_skel --extname=extname
Copier après la connexion

Si vous téléchargez directement Sous la branche master , il n'y a que le fichier ext_skel.php Pour le moment, vous pouvez exécuter directement ce fichier PHP

$ cd ext
$ php ext_skel.php --ext extname
Copier après la connexion

Comme je l'ai développé directement sous la branche master, les éléments suivants sont tous dans la branche master par défaut. .opérations ci-dessous.

Une fois l'extension générée, nous verrons quatre fichiers et un dossier. A ce stade, nous n'avons besoin d'utiliser que deux fichiers, le fichier .c et le fichier .h.

Un petit trou

Après avoir généré l'extension, nous pouvons essayer de la compiler

$ phpize
$ ./configure
$ make &&make test
Copier après la connexion

Nous serons surpris de constater qu'il y aura un avertissement lors de la compilation .

warning:implicitdeclaration of function
'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration]
ZEND_PARSE_PARAMETERS_NONE();
^
Copier après la connexion

1 avertissement généré.

Ensuite, vous exécutez make test et constatez qu'un test a échoué. C'est vrai, les fichiers générés par le script pour nous ont en fait échoué à nos propres tests. Tu trouves que c'est bizarre ? Examinons les informations spécifiques de l'avertissement. Fonction ZEND_PARSE_PARAMETERS_NONE introuvable. J'ai regardé le fichier et je l'ai trouvé à la ligne 15. Vous pouvez probablement deviner ce que cela signifie en regardant le nom de la fonction. Je suis donc allé chercher le code source PHP. Mais nous avons trouvé une telle définition macro.

#ifndefzend_parse_parameters_none
#definezend_parse_parameters_none()
zend_parse_parameters(ZEND_NUM_ARGS(),"")
#endif
Copier après la connexion

Après avoir remplacé les lettres majuscules d'origine, il n'y aura aucun avertissement. Cela peut être considéré comme le fonctionnaire creusant un petit trou pour nous. Bien qu'il existe des définitions de macros en majuscules, je ne sais pas pourquoi une erreur est signalée.

Définir une fonction

Je pense que lorsque la plupart des gens écrivent des extensions, ils espèrent certainement implémenter au moins une fonction. Ils n'ont pas seulement besoin de quelques variables globales pour écrire une extension (brouillard.

Ici PHP nous fournit une macro utile PHP_FUNCTION Il existe également deux fonctions définies dans le code généré. Vous pouvez vous référer à son utilisation. Cette macro sera éventuellement traduite en fonction. ). Il sera finalement traduit en voidzif_name(zend_execute_data*execute_data,zval*return_value)

En même temps, on voit qu'un tel tableau est défini

constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE_END
};
constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE(name,NULL)
PHP_FE_END
};
Copier après la connexion

Rappelez-vous, ne le faites pas. ajoutez un point - virgule ou une virgule à la fin . Enfin, nous pouvons afficher cette fonction

PHP_FUNCTION(name)
{
php_printf("Hellon");
}
Copier après la connexion

Après compilation et installation, nous pouvons utiliser cette fonction

Recommandations associées :

PHP. Compilation d'extension Tencent CMEM

Génération automatique du framework d'extension pour extension php

Comment écrire une extension php

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:php.cn
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