


Développer des extensions de PHP avec C et PHP-CPP: avancé
Feb 18, 2025 pm 12:30 PMDévelopper des extensions PHP avec C et PHP-CPP: sujets avancés et meilleures pratiques
Points clés
- Développer des extensions de PHP avec C et PHP-CPP implique des sujets avancés tels que le retour "ce" pointeurs, le retour des pointeurs d'objets complexes, l'exposition des méthodes magiques, le lien entre les appels de fonction des membres et le lancer et la manipulation des exceptions dans PHP.
__toString
La bibliothèque PHP-CPP est idéale pour les projets qui nécessitent des logiciels, des structures de données ou des algorithmes pour les projets non PHP à l'avenir, ou des projets qui nécessitent l'utilisation d'outils ou de bibliothèques non encore fournies comme extensions PHP. Il fournit également les avantages des performances du code C / C tout en maintenant le code structuré et orienté objet pour une compréhension et une maintenance faciles. - La bibliothèque PHP-CPP peut être utilisée pour des projets personnels et commerciaux. Cependant, bien que la bibliothèque elle-même soit gratuite, il peut prendre du temps et des ressources pour apprendre à l'utiliser efficacement et à maintenir les extensions de PHP.
- Les défis courants du développement d'extension PHP en utilisant C incluent la gestion correcte de la mémoire, la manipulation des erreurs et des exceptions, et l'interface entre PHP et C. Ces défis peuvent être surmontés en ayant un aper?u de PHP et C, en utilisant de bonnes pratiques de programmation et en tirant parti des fonctionnalités et des outils fournis par PHP-CPP.
Dans cet article, nous plongerons davantage dans le développement de la bibliothèque complexe, ajouterons plus de fonctions membres et aborderons certains sujets avancés en écrivant des extensions de PHP orientées objet en utilisant PHP-CPP:
- Renvoyez ce pointeur;
- Renvoie le pointeur d'objet complexe, c'est-à-dire complexe *; Open
- MéTHODE MAGIQUE; APPEL DE LA FONCTION DE LA CHATEUR;
- Garnir l'exception et le gérer en php
__toString
- Le code source complet de la bibliothèque complexe et les scripts PHP de test se trouvent dans ce référentiel GitHub.
- Commen?ons.
PRéPARATION
L'ensemble du processus de préparation de l'environnement est expliqué dans le premier article.
Renvoyez ce pointeur en c
Comme mentionné dans le deuxième article, nous utilisons des fonctions membres pour effectuer diverses opérations mathématiques sur des nombres complexes. Dans cette démonstration, nous implémenterons quatre de ces fonctions: Add, Sub, Mul et Div. Je vais expliquer les trois premiers en premier. La fonction DIV implique la gestion des exceptions, qui sera discutée plus tard.
Jetons un coup d'?il à la fonction MUL (pour la multiplication). Les fonctions ADD et sous sont à peu près les mêmes.
Remarque: Dans cet article, je n'introduirai pas certains sujets de base abordés auparavant, tels que la modification des fichiers MakeFile et INI, l'enregistrement des fonctions des membres, des classes et des espaces de noms, etc. Veuillez vous référer à la section précédente pour ces contenus.
Le renvoi de ce pointeur de C à PHP est simple. à l'intérieur de cette fonction C, ce pointeur (en tant que type complexe *) peut être renvoyé à PHP en tant que type de valeur PHP ::. La conversion ne perd aucune information d'objet. Il ne nécessite pas non plus de conversion de type explicite.
return le pointeur d'objet complexe
Retourner cela signifie généralement que l'objet lui-même a changé. Mais dans certains cas, nous voulons peut-être retourner un nouvel objet et laisser l'objet "actuel" (objet d'appel) inchangé.
Dans notre classe complexe, nous avons une fonction comme celle-ci qui renvoie le nombre conjugué d'un nombre complexe donné (A BI devient A-BI).
Php::Value add(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *a = (Complex *) t.implementation(); r += (double) a->getReal(); i += (double) a->getImage(); return this; }
Le point clé ici est que nous devons utiliser l'objet php :: pour convertir explicitement notre objet complexe * en objet php ::, donc lorsque l'objet est analysé plus tard par le script PHP, les informations de classe sont correctement assurées et conservées Son accessibilité.
Le premier paramètre de cette fonction est le type de classe, dans ce cas trcomplex. J'utilise ce nom parce que j'ai enveloppé cette classe ("complexe") dans un espace de noms séparé ("tr").
Le deuxième paramètre est l'objet à remettre en arrière.
Retourner une nouvelle instance de classe est un peu plus difficile que le simple retour de ce pointeur, mais il est toujours gérable tant que vous lisez la documentation et trouvez la partie correcte. Pour plus d'exemples d'utilisation, vous voudrez peut-être lire cette section dans la documentation officielle PHP-CPP.
Open __Tostring Magic Method
Dans notre classe, il existe une fonction __toString
qui imprime les nombres pluriels d'une manière plus lisible, par exemple: 1 2i. Dans mon article précédent, cette fonction n'est pas exposée (ou "enregistrée" dans la terminologie PHP-CPP), mais elle peut toujours être appelée à l'intérieur de PHP. Cependant, pour que cette fonction soit appelée sur l'objet complexe après avoir appliqué certaines opérations mathématiques (par exemple, "echo $ a- & gt; add ($ b) - & gt; sub ($ c)"), nous devons être compilés Il est explicitement enregistré dans l'extension:
Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }
Le problème que nous avons soumis dans le numéro de référentiel PHP-CPP # 150 explique en détail pourquoi nous devons le faire.
Fonction du membre de la cha?ne Appel
Une chose qui doit être mise en ?uvre dans cette classe est de pouvoir lier les fonctions des membres afin que nous puissions effectuer le calcul suivant: $ a- & gt; add ($ b) - & gt; sub ($ c). Le résultat devrait toujours être en mesure d'appeler ses fonctions de membre.
Ceci est fait par la méthode ci-dessus, c'est-à-dire, renvoyant ce pointeur à PHP. Cependant, les bibliothèques PHP-CPP plus anciennes ont des erreurs lorsque les objets déréférencés, et si la méthode de liaison est appelée, un "défaut de segment" est créé.
Le problème a été soumis (# 151) et une commission contenant le correctif de code source PHP-CPP a été soumise. Si vous utilisez une ancienne version de la bibliothèque PHP-CPP pour compiler la bibliothèque PHP-CPP et votre propre bibliothèque, veuillez mettre à jour le code source PHP et recompiler et réinstaller la bibliothèque PHP-CPP et votre bibliothèque.
comme expliqué dans le résumé de la soumission:
complex.method("__toString", &Complex::__toString);
Je suis content que mon propre travail de projet puisse aider les bibliothèques que j'utilise à devenir meilleures.
Exception et manipulation dans PHP
Deux autres fonctions dans notre classe complexe peuvent renvoyer des exceptions à PHP pour le traitement: div et phi. Le premier effectue un opération de division, tandis que le second renvoie l'angle du nombre complexe, comme le montre sa représentation alternative, la représentation des coordonnées polaires (R, θ).
Si vous passez un numéro pluriel en tant que paramètre (ou appelant), mais que la pièce et les parties imaginaires sont en fait 0, les deux opérations peuvent échouer. Pour ces deux opérations, nous devons effectuer une gestion des exceptions. N'oubliez pas que nous lan?ons des exceptions dans le code C, et le script PHP attrapera l'exception et effectuera le traitement nécessaire:
Php::Value add(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *a = (Complex *) t.implementation(); r += (double) a->getReal(); i += (double) a->getImage(); return this; }
Dans les scripts PHP, nous attrapons cette exception comme ceci:
Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }
Le code d'extrait de code ci-dessus affichera la ligne de texte suivante:
complex.method("__toString", &Complex::__toString);
C'est très simple, non? L'exception C construite dans notre extension est transmise à PHP et est correctement capturée. De plus, nous pouvons faire fonctionner des exceptions comme nous gérons des exceptions PHP natives lancées par d'autres codes PHP!
Testez toutes les fonctions
Enfin, nous pouvons compiler et installer l'extension complexe.so pour notre installation PHP via make && sudo make install
. Si tout se passe bien, nous pouvons vérifier l'installation de l'extension en émettant la commande suivante dans le terminal:
<code>修復(fù)問(wèn)題#151,鏈?zhǔn)椒椒ㄕ{(diào)用無(wú)法正常工作…… ……因?yàn)槊總€(gè)對(duì)象的引用計(jì)數(shù)未正確更新,這導(dǎo)致即使對(duì)象已分配給不同的變量,該對(duì)象也會(huì)被銷毀。</code>
Le terminal doit afficher une ligne qui indique "/etc/php5/cli/conf.d/complex.ini", nous pouvons nous assurer que notre extension est installée et prête à être appelée par n'importe quel script PHP.
Remarque: Si nous vérifions le Makefile pour cette extension, nous verrons que nous installons cette extension PHP dans son environnement CLI. Si nous voulons installer cette extension pour qu'Apache puisse le charger, nous modifions la ligne suivante:
Php::Value div(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *b = (Complex*) t.implementation(); double t1 = b->mod() * b->mod(); if (t1 == 0) throw Php::Exception("Division by zero"); double tr = r * (double) (b->getReal()) + i * (double) (b->getImage()); double ti = i * (double) (b->getReal()) - r * (double) (b->getImage()); r = tr / t1; i = ti / t1; return this; }
Le script PHP de test pour cette extension est le suivant, avec quelques notes:
$a=new tr\Complex(1,2); $c=new tr\Complex(); //$c實(shí)際上是0+0i try { $res=$a->div($c); } catch(Exception $e) { echo "Caught exception: ".$e->getMessage()."\n"; } }
Tous les scripts de test doivent s'exécuter correctement et l'exception est correctement capturée.
Conclusion
Cela résume ma série de 3 articles sur la construction de cette puissante bibliothèque avec C pour les extensions de PHP. Nous couvrons les bases, les aspects orientés objet et certains sujets avancés dans la programmation orientée objet. Nous avons également aidé PHP-CPP à s'améliorer.
Que pouvons-nous faire d'autre avec PHP-CPP? Je citerai quelques lignes de communication par e-mail que j'ai re?ues d'Emiel Bruijntjes (co-auteur de PHP-CPP):
Si vous travaillez sur un projet et que vous avez une ou plusieurs des exigences suivantes, la bibliothèque PHP-CPP est idéale: - Vous travaillez sur des logiciels / structures / algorithmes de données et vous souhaitez vous assurer que votre logiciel peut également être utilisé dans des projets non PHP à l'avenir. - Vous souhaitez utiliser un outil ou une bibliothèque qui n'est pas encore disponible comme extension PHP. - Vous voulez de meilleures performances de votre code C / C (par rapport à PHP), mais vous souhaitez également créer du code structuré et orienté objet pour une compréhension et une maintenance faciles par d'autres développeurs / collègues.
Les possibilités sont énormes: des frameworks (tels que PhalCon), des langages de modèle (tels que Smarty ou Twig), etc.
Veuillez laisser vos commentaires et opinions et dites-nous ce que vous avez fait avec cette bibliothèque!
FAQS sur le développement d'extensions de PHP avec c
Quels sont les avantages de l'utilisation de C pour développer des extensions de PHP?
Il y a de nombreux avantages à développer des extensions de PHP en utilisant C. Tout d'abord, il vous permet de profiter de la puissance et de la flexibilité de C dans votre application PHP. Cela peut améliorer les performances, en particulier dans les taches à forte intensité de calcul. Deuxièmement, il fournit un moyen de réutiliser le code C existant dans un environnement PHP, ce qui peut économiser beaucoup de temps et d'efforts de développement. Enfin, il vous permet de créer des extensions PHP personnalisées qui étendent les fonctionnalités de PHP et de fournir des fonctionnalités qui ne sont pas disponibles dans la bibliothèque PHP standard.
Comment commencer à utiliser C pour le développement d'extension PHP?
Pour commencer à utiliser C pour le développement d'extension PHP, vous devez avoir une compréhension de base des langages de programmation PHP et C. Vous devez également installer l'environnement de développement PHP et le compilateur C. Après avoir installé ces conditions préalables, vous pouvez commencer à écrire des extensions de PHP dans C. Il existe de nombreuses ressources disponibles en ligne, y compris des tutoriels et un exemple de code pour vous guider à travers ce processus.
Qu'est-ce que PHP-CPP et comment aide-t-il le développement d'extension PHP?
PHP-CPP est une bibliothèque pour développer des extensions de PHP en utilisant C. Il fournit un ensemble de classes et de méthodes C, simplifiant le processus d'écriture des extensions de PHP. Avec PHP-CPP, vous pouvez écrire des extensions de PHP d'une manière plus naturelle et intuitive, en utilisant la syntaxe et les concepts familiers de C. Cela peut rendre le processus de développement plus efficace et réduire les erreurs.
Puis-je utiliser PHP-CPP pour des projets commerciaux?
Oui, PHP-CPP est un logiciel open source qui peut être utilisé dans des projets personnels et commerciaux. Cependant, il est important de comprendre que même si la bibliothèque elle-même est gratuite, vous devrez peut-être investir du temps et des ressources pour apprendre à l'utiliser efficacement et à maintenir vos extensions de PHP.
Quels sont les défis courants pour le développement d'extension PHP en utilisant C et comment puis-je les surmonter?
Certains défis courants dans le développement d'extension PHP en utilisant C incluent la gestion correcte de la mémoire, la manipulation des erreurs et des exceptions, et l'interface entre PHP et C. Ces défis peuvent être surmontés en ayant un aper?u de PHP et C, en utilisant de bonnes pratiques de programmation et en tirant parti des fonctionnalités et des outils fournis par PHP-CPP.
Comment déboguer les extensions de PHP écrites en C?
Les extensions PHP écrites en C peuvent être déboguées à l'aide d'outils de débogage C standard. De plus, PHP-CPP fournit certaines fonctionnalités qui peuvent aider à déboguer, telles que la gestion des exceptions et les rapports d'erreurs.
Puis-je utiliser PHP-CPP avec d'autres bibliothèques C?
Oui, PHP-CPP peut être utilisé avec d'autres bibliothèques C. Cela vous permet de profiter de diverses fonctionnalités C dans les extensions PHP.
Comment améliorer les performances des extensions de PHP écrites en C?
Vous pouvez améliorer les performances des extensions de PHP en utilisant des algorithmes et des structures de données efficaces, en minimisant l'utilisation de la mémoire et en optimisant le code C. De plus, PHP-CPP fournit certaines fonctionnalités qui peuvent aider à améliorer les performances, telles que l'accès direct aux variables et aux fonctions PHP.
Puis-je contribuer du code au projet PHP-CPP?
Oui, le projet PHP-CPP est open source et la contribution de la communauté est la bienvenue. Vous pouvez contribuer votre code en signalant des bogues, en suggérant de nouvelles fonctionnalités ou en soumettant des correctifs.
Où puis-je trouver plus de ressources sur l'utilisation de C pour le développement d'extension PHP?
Il existe de nombreuses ressources disponibles en ligne pour apprendre à utiliser C pour le développement de l'extension PHP. Ces ressources comprennent des tutoriels, un exemple de code, de documentation et des forums. De plus, le site Web PHP-CPP fournit une grande quantité d'informations et de ressources sur l'utilisation de la bibliothèque.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)
