Dé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>修复问题#151,链式方法调用无法正常工作…… ……因为每个对象的引用计数未正确更新,这导致即使对象已分配给不同的变量,该对象也会被销毁。</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 tâches à 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!

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

Le PHP n'est pas en train de mourir, mais d'adapter et d'évoluer constamment. 1) PHP a subi plusieurs itérations de version depuis 1994 pour s'adapter aux nouvelles tendances technologiques. 2) Il est actuellement largement utilisé dans le commerce électronique, les systèmes de gestion de contenu et d'autres domaines. 3) PHP8 introduit le compilateur JIT et d'autres fonctions pour améliorer les performances et la modernisation. 4) Utilisez OPCACHE et suivez les normes PSR-12 pour optimiser les performances et la qualité du code.

L'avenir de PHP sera réalisé en s'adaptant aux nouvelles tendances technologiques et en introduisant des fonctionnalités innovantes: 1) s'adapter aux architectures de cloud computing, de conteneurisation et de microservice, en prenant en charge Docker et Kubernetes; 2) introduire des compilateurs JIT et des types d'énumération pour améliorer l'efficacité des performances et du traitement des données; 3) Optimiser en continu les performances et promouvoir les meilleures pratiques.

En PHP, le trait convient aux situations où la réutilisation de la méthode est requise mais ne convient pas à l'héritage. 1) Le trait permet aux méthodes de multiplexage des classes pour éviter une complexité de succession multiple. 2) Lorsque vous utilisez un trait, vous devez faire attention aux conflits de méthode, qui peuvent être résolus par l'alternative et comme mots clés. 3) La surutilisation du trait doit être évitée et sa responsabilité unique doit être maintenue pour optimiser les performances et améliorer la maintenabilité du code.

Le conteneur d'injection de dépendance (DIC) est un outil qui gère et fournit des dépendances d'objets à utiliser dans les projets PHP. Les principaux avantages du DIC comprennent: 1. Le découplage, rendre les composants indépendants, et le code est facile à entretenir et à tester; 2. Flexibilité, facile à remplacer ou à modifier les dépendances; 3. Testabilité, pratique pour injecter des objets simulés pour les tests unitaires.

SPLFixedArray est un tableau de taille fixe en PHP, adapté aux scénarios où des performances élevées et une faible utilisation de la mémoire sont nécessaires. 1) Il doit spécifier la taille lors de la création pour éviter les frais généraux causés par un ajustement dynamique. 2) Sur la base du tableau de langue C, fonctionne directement de la mémoire et de la vitesse d'accès rapide. 3) Convient pour le traitement des données à grande échelle et les environnements sensibles à la mémoire, mais il doit être utilisé avec prudence car sa taille est fixe.

PHP gère les téléchargements de fichiers via la variable de fichiers $ \ _. Les méthodes pour garantir la sécurité incluent: 1. Vérifiez les erreurs de téléchargement, 2. Vérifiez le type et la taille du fichier, 3. Empêchez l'écrasement des fichiers, 4. Déplacez les fichiers vers un emplacement de stockage permanent.

Dans JavaScript, vous pouvez utiliser nullcoalescingoperator (??) et nullcoalescingAssIgnmentOperator (?? =). 1.? 2.?? Ces opérateurs simplifient la logique du code, améliorent la lisibilité et les performances.


Outils d'IA chauds

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.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Version Mac de WebStorm
Outils de développement JavaScript utiles

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire