PHP-Erweiterungen mit C und PHP-CPP entwickeln: Fortgeschrittene Themen und Best Practices
Schlüsselpunkte
__toString
Die
In diesem Artikel werden wir weiter in die Entwicklung der komplexen Bibliothek eintauchen, mehr Mitgliedsfunktionen hinzufügen und einige erweiterte Themen beim Schreiben von objektorientierten PHP-Erweiterungen unter Verwendung von PHP-CPP ansprechen:
__toString
Bedecken Sie die Ausnahme und behandeln Sie sie in PHP Vorbereitung
Der gesamte Prozess der Vorbereitung der Umgebung wird im ersten Artikel erläutert.
Gibt diesen Zeiger in Czurück
Wie im zweiten Artikel erwähnt, verwenden wir Mitgliederfunktionen, um verschiedene mathematische Operationen für komplexe Zahlen auszuführen. In dieser Demonstration werden wir vier solcher Funktionen implementieren: Add, Sub, Mul und Div. Ich werde die ersten drei zuerst erklären. Die DIV -Funktion beinhaltet die Ausnahmehandhabung, die später diskutiert wird. Schauen wir uns die MUL -Funktion an (zur Multiplikation). Die Hinzufügen und Unterfunktionen sind ungefähr gleich.
HINWEIS: In diesem Artikel werde ich einige grundlegende Themen, die zuvor besprochen werden, nicht vorstellen, z. B. die Änderung von Makefile- und INI -Dateien, Registrieren von Mitgliederfunktionen, Klassen und Namespaces usw. Weitere Informationen finden Sie im vorherigen Abschnitt für diese Inhalte.
, die diesen Zeiger von C auf PHP zurückgibt, ist einfach. In dieser C -Funktion kann dieser Zeiger (als komplex* Typ) als PHP :: Werttyp an PHP zurückgegeben werden. Die Konvertierung verliert keine Objektinformationen. Es erfordert auch keine explizite Konvertierung vom Typ.
Return komplexen Objektzeiger
Rückgabe Dies bedeutet normalerweise, dass sich das Objekt selbst geändert hat. In einigen Fällen möchten wir jedoch möglicherweise ein neues Objekt zurückgeben und das "aktuelle" Objekt (Call -Objekt) unverändert lassen.
In unserer komplexen Klasse haben wir eine solche Funktion, die die konjugierte Anzahl einer bestimmten komplexen Zahl zurückgibt (ein Bi wird 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; }
Der wichtigste Punkt hier ist, dass wir Php :: Objekt verwenden müssen, um unser komplexes* Objekt explizit in Php :: -Objekt umzuwandeln. Wenn das Objekt später vom PHP -Skript analysiert wird, werden die Klasseninformationen ordnungsgemäß gewährleistet und aufbewahrt Seine Zugänglichkeit.
Der erste Parameter dieser Funktion ist der Klassentyp, in diesem Fall tryprlex. Ich benutze diesen Namen, weil ich diese Klasse ("komplex") in einen separaten Namespace ("tr") eingewickelt habe.
Der zweite Parameter ist das zu übergebene Objekt.
Rückgabe einer neuen Klasseninstanz ist etwas schwieriger, als nur diesen Zeiger zurückzugeben, aber es ist immer noch überschaubar, solange Sie die Dokumentation lesen und den richtigen Teil finden. Weitere Nutzungsbeispiele möchten diesen Abschnitt in der offiziellen PHP-CPP-Dokumentation lesen.
öffnen __toString Magic -Methode
In unserer Klasse gibt es eine __toString
-Funktion, die Pluralnummern auf lesbare Weise druckt, zum Beispiel: 1 2i. In meinem vorherigen Beitrag wird diese Funktion nicht in der PHP-CPP-Terminologie freigelegt (oder "registriert"), kann aber immer noch von InnenpHP aufgerufen werden. Damit diese Funktion das komplexe Objekt auffordert, nachdem wir einige mathematische Operationen angewendet haben (z. Es ist ausdrücklich in der Erweiterung registriert:
Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }
Das Problem, das wir im PHP-CPP-Repository-Problem Nr. 150 eingereicht haben, werden ausführlich beschrieben, warum wir dies tun müssen.
Kettenelementfunktion Aufruf
Eine Sache, die in dieser Klasse implementiert werden muss, besteht darin, Mitgliederfunktionen zu verknüpfen, damit wir die folgende Berechnung ausführen können: $ a- & gt; add ($ b)-& gt; sub ($ c). Das Ergebnis sollte immer noch in der Lage sein, seine Mitgliederfunktionen anzurufen.
Dies geschieht mit der obigen Methode, dh, die diesen Zeiger an PHP zurückgibt. Ältere PHP-CPP-Bibliotheken haben jedoch Fehler, wenn Objekte derenferenzierten, und wenn die Verbindungsmethode aufgerufen wird, wird ein "Segmentfehler" erstellt.
Das Problem wurde eingereicht (Nr. 151) und ein Commit mit dem PHP-CPP-Quellcode-Patch wurde eingereicht. Wenn Sie eine ältere Version der PHP-CPP-Bibliothek verwenden, um die PHP-CPP-Bibliothek und Ihre eigene Bibliothek zu kompilieren, aktualisieren Sie den PHP-Quellcode und umfassen Sie die PHP-CPP-Bibliothek und Ihre Bibliothek neu.
Wie in der Übermittlungsergebnis erläutert:
complex.method("__toString", &Complex::__toString);
Ich bin froh, dass meine eigene Projektarbeit den Bibliotheken helfen kann, die ich verwende, besser werden.
Ausnahmewerfen und Handling in Php
Zwei weitere Funktionen in unserer komplexen Klasse können Ausnahmen zu PHP zur Verarbeitung zurückbringen: Div und Phi. Ersteres führt den Teilungsvorgang durch, während letztere den Winkel der komplexen Zahl zurückgibt, wie in seiner alternativen Darstellung der polaren Koordinatendarstellung (R, θ) gezeigt.
Wenn Sie eine Pluralnummer als Parameter (oder Anrufer) übergeben, aber der Teil und die imaginären Teile tatsächlich 0 sind, können beide Vorgänge fehlschlagen. Für diese beiden Operationen müssen wir Ausnahmebehandlung durchführen. Denken Sie daran, dass wir Ausnahmen in den C -Code werfen, und das PHP -Skript fängt die Ausnahme ein und führt die erforderliche Verarbeitung durch:
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; }
In PHP -Skripten fangen wir diese Ausnahme wie folgt an:
Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }
Das obige Code -Snippet zeigt die folgende Textzeile an:
complex.method("__toString", &Complex::__toString);
Es ist sehr einfach, oder? Die in unserer Erweiterung konstruierte C -Ausnahme wird an PHP zurückgegeben und korrekt gefangen. Darüber hinaus können wir Ausnahmen ausführen, wie wir native PHP -Ausnahmen behandeln, die von anderen PHP -Codes geworfen werden!
Testen Sie alle Funktionen
Schließlich können wir die Komplex.SO -Erweiterung für unsere PHP -Installation über make && sudo make install
kompilieren und installieren. Wenn alles gut geht, können wir die Installation der Erweiterung überprüfen, indem wir den folgenden Befehl im Terminal ausgeben:
<code>修复问题#151,链式方法调用无法正常工作…… ……因为每个对象的引用计数未正确更新,这导致即使对象已分配给不同的变量,该对象也会被销毁。</code>
Das Terminal sollte eine Zeile mit "/etc/php5/cli/conf.d/complex.ini" anzeigen. Wir können sicherstellen, dass unsere Erweiterung installiert und bereit ist, von jedem PHP -Skript aufgerufen zu werden.
Hinweis: Wenn wir die Makefile für diese Erweiterung überprüfen, werden wir feststellen, dass wir diese PHP -Erweiterung in seine CLI -Umgebung installieren. Wenn wir diese Erweiterung installieren möchten, damit Apache sie laden kann, ändern wir die folgende Zeile:
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; }
Das Test -PHP -Skript für diese Erweiterung lautet wie folgt mit einigen Notizen:
$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"; } }
Alle Testskripte sollten korrekt ausgeführt werden und die Ausnahme wird korrekt erfasst.
Schlussfolgerung
Dies fasst meine 3 -Artikel -Serie zum Erstellen dieser leistungsstarken Bibliothek mit C für PHP -Erweiterungen zusammen. Wir behandeln die Grundlagen, objektorientierten Aspekte und einige erweiterte Themen in der objektorientierten Programmierung. Wir haben auch dazu beigetragen, dass PHP-CPP sich verbessert.
Was können wir sonst noch mit PHP-CPP machen? Ich werde ein paar Zeilen der E-Mail-Kommunikation zitieren, die ich von Emiel Bruijntjes (Co-Autor von PHP-CPP) erhalten habe:
Wenn Sie an einem Projekt arbeiten und eine oder mehrere der folgenden Anforderungen haben, ist die PHP-CPP-Bibliothek ideal: -Sie arbeiten an Software/Datenstrukturen/Algorithmen und möchten sicherstellen, dass Ihre Software in Zukunft auch in Nicht-Php-Projekten verwendet werden kann. - Sie möchten ein Tool oder eine Bibliothek verwenden, die noch nicht als PHP -Erweiterung verfügbar ist. -Sie möchten eine bessere Leistung Ihres C/C-Codes (im Vergleich zu PHP), aber Sie möchten auch strukturierten, objektorientierten Code für das einfache Verständnis und die Wartung durch andere Entwickler/Kollegen erstellen.
Die Möglichkeiten sind riesig: Frameworks (wie Phalcon), Vorlagensprachen (wie Smarty oder Twig) usw.
Bitte hinterlassen Sie Ihre Kommentare und Meinungen und teilen Sie uns mit, was Sie mit dieser Bibliothek getan haben!
FAQs zur Entwicklung von PHP -Erweiterungen mit C
Es gibt viele Vorteile für die Entwicklung von PHP -Erweiterungen mit C. C. Erstens können Sie die Leistung und Flexibilität von C in Ihrer PHP -Anwendung nutzen. Dies kann die Leistung verbessern, insbesondere bei rechenintensiven Aufgaben. Zweitens bietet es eine Möglichkeit, vorhandenen C -Code in einer PHP -Umgebung wiederzuverwenden, mit der viel Entwicklungszeit und -aufwand sparen können. Schließlich können Sie benutzerdefinierte PHP -Erweiterungen erstellen, die die Funktionalität von PHP erweitern und Funktionen bereitstellen, die in der Standard -PHP -Bibliothek nicht verfügbar sind.
Um C für die Entwicklung von PHP -Erweiterung zu verwenden, müssen Sie ein grundlegendes Verständnis von PHP- und C -Programmiersprachen haben. Sie müssen auch die PHP -Entwicklungsumgebung und den C -Compiler installieren. Nach der Installation dieser Voraussetzungen können Sie mit dem Schreiben von PHP -Erweiterungen in C beginnen, in C. Es sind viele Ressourcen online verfügbar, einschließlich Tutorials und Beispielcode, um Sie durch diesen Prozess zu führen.
PHP-CPP ist eine Bibliothek zur Entwicklung von PHP-Erweiterungen mit C. Es bietet eine Reihe von C -Klassen und -Methoden und vereinfacht den Prozess des Schreibens von PHP -Erweiterungen. Mit PHP-CPP können Sie PHP-Erweiterungen auf natürlichere und intuitivere Weise mit den bekannten Syntax und Konzepten von C schreiben. Dies kann den Entwicklungsprozess effizienter gestalten und Fehler verringern.
Ja, PHP-CPP ist Open-Source-Software, die in persönlichen und kommerziellen Projekten verwendet werden kann. Es ist jedoch wichtig zu verstehen, dass die Bibliothek selbst zwar frei ist, Sie jedoch möglicherweise Zeit und Ressourcen investieren müssen, um zu lernen, wie Sie sie effektiv verwenden und Ihre PHP -Erweiterungen aufrechterhalten.
Einige häufige Herausforderungen bei der Entwicklung von PHP -Erweiterung unter Verwendung von C umfassen die korrekte Verwaltung des Speichers, die Behandlung von Fehlern und Ausnahmen sowie die Schnittstelle zwischen PHP und C. Diese Herausforderungen können durch einen Einblick in PHP und C gewonnen werden, indem sie gute Programmierpraktiken verwenden und die von PHP-CPP bereitgestellten Funktionen und Tools nutzen.
in C geschriebene PHP -Erweiterungen können mit Standard -C -Debugging -Tools debuggen werden. Darüber hinaus bietet PHP-CPP einige Funktionen, mit denen das Debuggen wie Ausnahmebehandlung und Fehlerberichterstattung helfen können.
Ja, PHP-CPP kann mit anderen C-Bibliotheken verwendet werden. Auf diese Weise können Sie verschiedene C -Funktionen in PHP -Erweiterungen nutzen.
Sie können die Leistung von PHP -Erweiterungen verbessern, indem Sie effiziente Algorithmen und Datenstrukturen verwenden, die Speicherverwendung minimieren und den C -Code optimieren. Darüber hinaus bietet PHP-CPP einige Funktionen, mit denen die Leistung verbessert wird, z. B. den direkten Zugriff auf PHP-Variablen und -funktionen.
Ja, das PHP-CPP-Projekt ist Open Source und der Beitrag der Community ist willkommen. Sie können Ihren Code beitragen, indem Sie Fehler melden, neue Funktionen vorschlagen oder Patches senden.
Es gibt viele Ressourcen online für das Lernen, C für die Entwicklung von PHP -Erweiterung zu lernen. Diese Ressourcen umfassen Tutorials, Beispielcode, Dokumentation und Foren. Darüber hinaus bietet die PHP-CPP-Website eine große Menge an Informationen und Ressourcen zur Verwendung der Bibliothek.
Das obige ist der detaillierte Inhalt vonEntwicklung von PHP-Erweiterungen mit C und PHP-CPP: Fortgeschrittene. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!