Schreiben von Parametern für PHP-Erweiterungsfunktionen
Funktionsparameter
Der einfachste Weg, die vom Funktionsaufrufer übergebenen Parameter zu erhalten, ist die Verwendung der Funktion zend_parse_parameters(). Wir können die ersten paar Parameter der Funktion zend_parse_parameters() mithilfe von Makros im Kernel direkt generieren, in der Form: ZEND_NUM_ARGS() TSRMLS_CC. Beachten Sie, dass zwischen den beiden ein Leerzeichen, aber kein Komma steht. Wie aus dem Namen hervorgeht, repräsentiert ZEND_NUM_ARGS() die Anzahl der Parameter. Der nächste Parameter, der an die Funktion zend_parse_parameters() übergeben werden muss, ist ein String, der zur Formatierung verwendet wird, genau wie der erste Parameter von printf. Nachfolgend sind einige der am häufigsten verwendeten Symbole dargestellt.
type_spec ist eine Formatzeichenfolge, ihre allgemeine Bedeutung ist wie folgt:
Parameter repräsentiert den Typ
b Boolean
l Integer
d Gleitkomma Gleitkomma
s String String
r Ressource Ressource
a Array Array
o Objektinstanz Objekt
O Objektinstanz eines angegebenen Typs Objekt eines bestimmten Typs
z Unspezifischer zval Jeder Typ ~
Z Der zval** Typ
f stellt den Funktions- und Methodennamen dar. Es scheint, dass es so etwas in PHP5.1 nicht gibt...
Diese Funktion ist genau wie die Funktion printf() die Formatzeichenfolge. Die Formate entsprechen eins zu eins. Einige grundlegende Datentypen werden direkt Typen in der C-Sprache zugeordnet.
ZEND_FUNCTION(sample_getlong) {
long foo;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"l", &foo) == FAILURE)
{
RETURN_ NULL() ;
}
php_printf("Der ganzzahlige Wert des Parameters ist: %ldn", foo);
RETURN_TRUE; Die Daten sind in der Regel gleich, es gibt jedoch Ausnahmen. Daher sollten wir das lange Array nicht in ein int einfügen, insbesondere auf einer 64-Bit-Plattform, da dies zu einigen Fehlern führt, die nicht einfach zu beheben sind. Daher sollten wir beim Empfang von Parametern über die Funktion zend_parse_parameter() Variablen der vom Kernel vereinbarten Typen als Träger verwenden.
Parameter entspricht dem Datentyp in C
b zend_bool
l long
d double
s char*, int Ersteres erhält den Zeiger, letzteres die Länge
r zval *
a zval*
o zval*
O zval*, zend_class_entry*
z zval*
Z zval**
Beachten Sie, dass alle zusammengesetzten Typparameter in der PHP-Sprache zval* erfordern. Typ Als Träger, da es sich um einige vom Kernel angepasste Datenstrukturen handelt. Wir müssen bestätigen, dass der Typ des Parameters und der Träger konsistent sind. Bei Bedarf kann eine Typkonvertierung durchgeführt werden, z. B. die Konvertierung des Arrays in ein stdClass-Objekt. Über die Typen „s“ und „O“ (europäischer Großbuchstabe) muss gesondert gesprochen werden, da beide zwei Träger benötigen. In den nächsten Kapiteln erfahren Sie mehr über die spezifische Implementierung von Objekten in PHP. Schreiben wir also eine Funktion um, die wir in Kapitel 5 definiert haben:
function sample_hello_world($name) {
echo "Hello $name!n"}
Beim Schreiben einer Erweiterung, wir müssen zend_parse_parameters() verwenden, um diese Zeichenfolge zu erhalten:
ZEND_FUNCTION(sample_hello_world) {
char *name;
if (zend_parse_parameters(ZEND_NUM_ARGS( ) TSRMLS_CC, "s",&name, &name_len) == FAILURE)
{
RETURN_NULL();
}
php_printf("Hallo ");
PHPWRITE(name, name_len); php_printf("!n");
}
Wenn die Anzahl der an die Funktion übergebenen Parameter geringer ist als die Anzahl der von zend_parse_parameters() zu empfangenden Parameter, schlägt sie fehl und gibt FAILURE zurück.
Wenn wir mehrere Parameter empfangen müssen, können wir die empfangenden Träger direkt in den Parametern von zend_parse_paramenters() auflisten, wie zum Beispiel:
function sample_hello_world($name, $greeting) {
echo "Hello $greeting $name!n";
}
sample_hello_world('John Smith', 'Mr.');
Dies sollte in der PHP-Erweiterung implementiert werden:
ZEND_FUNCTION( sample_hello_world) {
char *name;
int name_len;
char *greeting_len;if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",&name, &name_len, &greeting, &greeting_len) == FAILURE) {
RETURN_NULL();
}
php_printf("Hallo ");
PHPWRITE(greeting, Greeting_len);
php_printf(" ");
PHPWRITE(name, name_len);
php_printf("!n"}
Zusätzlich zu den definierten Parametern Oben gibt es drei weitere Parameter, um unsere Fähigkeit zum Empfangen von Parametern zu verbessern:
Typmodifikator Bedeutung
| Werte.
! Wenn Sie eine Nullvariable in der PHP-Sprache erhalten, wird diese direkt in NULL in der C-Sprache konvertiert, anstatt sie in ein zval vom Typ IS_NULL zu kapseln.
/ Wenn die übergebene Variable einen zval mit anderen Variablen teilt und keine Referenz ist, wird sie gezwungen, den neuen zval zu trennen: is_ref__gc==0 und refcount__gc==1 🎜>Lassen Sie uns nun mit dem Umschreiben von sample_hello_world() fortfahren. Als nächstes verwenden wir die Standardwerte einiger Parameter, was in der PHP-Sprache wie folgt aussieht:
function sample_hello_world($name , $greeting='Mr./Ms.') {
echo "Hallo $greeting $name!n";
sample_hello_world('Ginger Rogers','Ms.'); sample_hello_world('Fred Astaire ');
Zu diesem Zeitpunkt können Sie nur einen Parameter an sample_hello_world übergeben, oder Sie können zwei vollständige Parameter übergeben. Wie können wir also dieselbe Funktion in der Erweiterungsfunktion implementieren? Wir müssen den Parameter (|) in zend_parse_parameters verwenden. Die Parameter vor diesem Parameter gelten als notwendig, und die folgenden Parameter gelten als nicht wesentlich. Wenn sie nicht übergeben werden, wird der Träger nicht geändert.
ZEND_FUNCTION(sample_hello_world) {
char *name;
int name_len;
char *greeting = „Mr./Mrs.“; „) – 1; > }
php_printf("Hallo ");
PHPWRITE(gruss, Greeting_len);
PHPWRITE(name, name_len); );
}
Wenn Sie den zweiten Parameter nicht übergeben, wird die Erweiterungsfunktion als Standard betrachtet und ändert den Vektor nicht. Daher müssen wir den Wert des Trägers selbst voreinstellen, der oft NULL ist, oder einen Wert, der sich auf die Funktionslogik bezieht. Jeder zval, einschließlich des zval vom Typ IS_NULL, muss eine bestimmte Menge an Speicherplatz belegen und benötigt CPU-Rechenressourcen, um Speicher dafür zu beantragen, ihn zu initialisieren und nach Abschluss seiner Arbeit freizugeben. Aber viel Code erkennt dies nicht. Es gibt eine Menge Code, der einen Nullwert in den IS_NULL-Typ von zval einschließt. Diese Operation kann in der erweiterten Entwicklung optimiert werden. Wir können den Parameter als NULL in der C-Sprache empfangen. Schauen wir uns den folgenden Code zu diesem Problem an:
ZEND_FUNCTION(sample_arg_fullnull) {
zval *val; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z",&val) == FAILURE) {
RETURN_NULL();
}
if (Z_TYPE_P(val) == IS_NULL) {
val = php_sample_make_defaultval(TSRMLS_C);
}
...
}
ZEND_FUNCTION (sample_arg_nullok) {
zval *val;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!",
{
RETURN_NULL(
}
if (! val) {
val = php_sample_make_defaultval(
}
}
Die beiden Codeteile sehen auf den ersten Blick nicht sehr unterschiedlich aus, aber der erste Codeteil erfordert mehr CPU- und Speicherressourcen. Vielleicht ist diese Technik in normalen Zeiten nicht sehr nützlich, aber es ist besser, sie zu kennen, als sie nicht zu kennen.
Erzwungene Trennung
Wenn eine Variable an eine Funktion übergeben wird, unabhängig davon, ob sie referenziert ist oder nicht, wird ihr refcoung__gc-Attribut um eins erhöht und beträgt mindestens 2. Eine Kopie ist sie selbst und die andere ist die an die Funktion übergebene Kopie. Bevor dieser Wert geändert wird, ist es manchmal erforderlich, ihn im Voraus in zwei tatsächliche Kopien aufzuteilen. Dies ist die Rolle des Formatzeichens „/“. Dadurch wird das Copy-on-Write-zval im Voraus in zwei vollständige und unabhängige Kopien aufgeteilt, sodass wir es im folgenden Code nach Belieben bearbeiten können. Andernfalls müssen wir uns möglicherweise ständig daran erinnern, die empfangenen Parameter und andere Vorgänge zu trennen. Wie das NULL-Flag folgt dieser Modifikator dem Typ, den er beeinflussen soll. Ebenso wie das NULL-Flag wissen Sie erst, dass Sie diese Funktion benötigen
zend_get_arguments()
Wenn Sie möchten, dass Ihre Erweiterung mit älteren PHP-Versionen kompatibel ist oder Sie einfach nur zval als Träger zum Empfangen von Parametern verwenden möchten, können Sie die Funktion zend_get_parameters() zum Empfangen von Parametern in Betracht ziehen. zend_get_parameters() unterscheidet sich von zend_parse_parameters(). Wie wir aus dem Namen ersehen können, wird es direkt ohne Analyse abgerufen. Zunächst einmal wird nicht automatisch eine Typkonvertierung durchgeführt. Die Träger aller Parameter in der Erweiterungsimplementierung müssen sich das einfachste Beispiel ansehen:
ZEND_FUNCTION(sample_onearg) {
zval * firstarg ;
if (zend_get_parameters(ZEND_NUM_ARGS(), 1, &firstarg)== FAILURE) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mindestens 1 Parameter erwartet.");
}
/* Etwas mit firstarg machen... */
}
Zweitens gibt zend_get_parameters() selbst keinen Fehler aus, wenn der Empfang fehlschlägt, und kann auch nicht bequem den Standardwert für den Parameter verarbeiten. Der letzte Punkt besteht darin, dass es sich von zend_parse_parameters dadurch unterscheidet, dass es automatisch alle Zvals, die dem Kopieren beim Schreiben entsprechen, zwangsweise trennt, eine neue Kopie generiert und diese an die Funktion sendet. Wenn Sie die anderen Funktionen nutzen möchten, diese Funktion aber nicht benötigen, können Sie versuchen, die Funktion zend_get_parameters_ex() zum Empfangen von Parametern zu verwenden. Um die Variablen von Copy-on-Write nicht zu trennen, sind die Parameter von zend_get_parameters_ex() vom Typ zval** statt zval*. Diese Funktion wird vielleicht nicht sehr oft verwendet, wenn Sie auf extreme Probleme stoßen, aber sie ist sehr einfach zu verwenden:
ZEND_FUNCTION(sample_onearg) {
zval **firstarg; zend_get_parameters_ex(1, &firstarg) == FAILURE) {
WRONG_PARAM_COUNT;
}
/* Mach etwas mit firstarg... */
}
Beachten Sie, dass zend_get_parameters_ex kein ZEND_NUM_ARGS() erfordert Als Parameter wird er nicht mehr benötigt, da er zu einem späteren Zeitpunkt hinzugefügt wurde.
Das Makro WRONG_PARAM_COUNT wird auch im obigen Beispiel verwendet. Seine Funktion besteht darin, eine Fehlermeldung der Stufe E_WARNING auszulösen und diese automatisch zurückzugeben.
Variable Parameter
Es gibt zwei weitere zend_get_parameter_**-Funktionen, die speziell zur Lösung des Problems vieler Parameter verwendet werden oder die Anzahl der Parameter nicht im Voraus bekannt sein kann. Denken Sie über die Verwendung der Funktion var_dump() in der PHP-Sprache nach. Wir können ihr eine beliebige Anzahl von Parametern übergeben. Ihre Implementierung im Kernel sieht tatsächlich so aus:
ZEND_FUNCTION(var_dump) {
int i, argc = ZEND_NUM_ARGS ();
zval ***args;
args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0); == 0 ||. zend_get_parameters_array_ex(argc, args) == FAILURE) {
efree(args);
WRONG_PARAM_COUNT;
}
for (i=0; i
}
efree(args);
}
Das Programm ermittelt zunächst die Anzahl der Parameter und beantragt dann eine entsprechende Speichergröße über die Funktion „safe_emalloc“, um diese Parameter vom Typ zvals ** zu speichern. Die Funktion zend_get_parameters_array_ex() wird hier verwendet, um die an die Funktion übergebenen Parameter in Argumente zu füllen. Sie haben vielleicht sofort gedacht, dass es auch eine Funktion namens zend_get_parameters_array() gibt. Der einzige Unterschied besteht darin, dass sie Parameter vom Typ zval* in args füllt und ZEND_NUM_ARGS() als Parameter benötigt.

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.
