


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ù)問題#151,鏈?zhǔn)椒椒ㄕ{(diào)用無法正常工作…… ……因為每個對象的引用計數(shù)未正確更新,這導(dǎo)致即使對象已分配給不同的變量,該對象也會被銷毀。</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實際上是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)

Sujets chauds

Toversionaphp basé sur la performance, utilisation de la Version basée sur la croissance et la SEAFROURSE, Séparable CodééToAvoid Conclict, dépréciant les versions avec la Communication et la vision de la ConsiderCustomEnlywhencesseary.

ToseCurelyHandleAuthentication andAuthorizationInPhp, suivitheSesteps: 1.AlwayShashPasswordSwithPassword_Hash () etverifyusingPassword_verify (), usePreparedStatementStopReventsQLendiject, andstoreSerDatain $ _SessionAfterLogin.2

ProcéduralandObject-OriendEdProgramming (OOP) inphpdiffersignifiancely instructure, réutilisabilité et datahandling.1.ProceduralProgrammingususFonctionnets organisé sécrégence, approprié modéliste.2.

PhpDoOesNothAveAbilt-InweakMapButoffersWeakreferenceForsiMarFonctionality.1.WeakReferenceallowsholdingreferences withoutpreventinggarbageCollection.2.itisationfulforcaching, les événements, et lametadatawithoutaffectingobjectlifecycles.3.

Pour gérer en toute sécurité les téléchargements de fichiers dans PHP, le noyau consiste à vérifier les types de fichiers, à renommer les fichiers et à restreindre les autorisations. 1. Utilisez finfo_file () pour vérifier le type de mime réel, et seuls des types spécifiques tels que l'image / jpeg sont autorisés; 2. Utilisez Uniqid () pour générer des noms de fichiers aléatoires et les stocker dans le répertoire racine non Web; 3. Limiter la taille du fichier via les formulaires PHP.ini et HTML et définir les autorisations de répertoire sur 0755; 4. Utilisez Clamav pour scanner les logiciels malveillants pour améliorer la sécurité. Ces étapes empêchent efficacement les vulnérabilités de sécurité et garantissent que le processus de téléchargement de fichiers est s?r et fiable.

En PHP, la principale différence entre == et == est la rigueur de la vérification des types. == La conversion de type sera effectuée avant la comparaison, par exemple, 5 == "5" Renvoie True, et === Demande que la valeur et le type soient les mêmes avant que True sera renvoyé, par exemple, 5 === "5" Renvoie False. Dans les scénarios d'utilisation, === est plus sécurisé et doit être utilisé en premier, et == n'est utilisé que lorsque la conversion de type est requise.

Oui, PHP peut interagir avec les bases de données NoSQL comme MongoDB et Redis à travers des extensions ou des bibliothèques spécifiques. Tout d'abord, utilisez le pilote MongoDBPHP (installé via PECL ou Composer) pour créer des instances clients et faire fonctionner des bases de données et des collections, en prenant en charge l'insertion, la requête, l'agrégation et d'autres opérations; Deuxièmement, utilisez la bibliothèque Predis ou l'extension PHPREDIS pour vous connecter à Redis, effectuer des paramètres et des acquisitions de valeur clé, et recommander PHPredis pour des scénarios à haute performance, tandis que Predis est pratique pour un déploiement rapide; Les deux conviennent aux environnements de production et sont bien documentés.

Les méthodes d'utilisation des opérations mathématiques de base en PHP sont les suivantes: 1. Les signes d'addition prennent en charge les entiers et les nombres à virgule flottante, et peuvent également être utilisés pour les variables. Les numéros de cha?ne seront automatiquement convertis mais non recommandés en dépendances; 2. Les signes de soustraction utilisent - les signes, les variables sont les mêmes et la conversion de type est également applicable; 3. Les panneaux de multiplication utilisent * les panneaux, qui conviennent aux nombres et aux cha?nes similaires; 4. La division utilise / signes, qui doit éviter de diviser par zéro, et noter que le résultat peut être des nombres à virgule flottante; 5. Prendre les signes du module peut être utilisé pour juger des nombres impairs et uniformes, et lors du traitement des nombres négatifs, les signes restants sont cohérents avec le dividende. La clé pour utiliser correctement ces opérateurs est de s'assurer que les types de données sont clairs et que la situation limite est bien gérée.
