


Detaillierte Erläuterung des Aufrufs und Ausführungsprozesses benutzerdefinierter PHP-Funktionen
Für den Aufruf einer Funktion sind einige grundlegende Informationen erforderlich, z. B. der Name der Funktion, Parameter und die Definition der Funktion (d. h. der spezifische Ausführungsinhalt der Funktion). Wenn eine Funktion definiert ist und wir sie ausführen, kennen Sie natürlich den Namen dieser Funktion, welche Parameter beim Aufruf übergeben werden und den Operationsinhalt der Funktion. Allerdings kann die Zend-Engine den PHP-Quellcode nicht so „verstehen“ wie wir. Sie muss den Code verarbeiten, bevor er ausgeführt werden kann. Beginnen wir mit den folgenden zwei kleinen Beispielen:
<?php function foo(){ echo "I'm foo!"; } foo(); ?>
Werfen wir einen Blick auf die entsprechenden Opcodes:
Funktionsname: (null)line # * op return Operanden
------------------------------- ----------------------- DO_FCALL
# * op - ------------------------------------------------- - -----------------
4 0 > ECHO 1 1 > RETURN >
Die oben aufgeführten Opcodes enthalten einige entfernte Peripherieinformationen Opcodes des Funktionsteils werden während der Ausführung getrennt. Dies ist besonders wichtig für die Ausführung der Funktion. Konzentrieren wir uns nun auf den Aufruf der Funktion foo. Der OPCODE, der foo aufruft, ist „DO_FCALL“. Wenn DO_FCALL eine Funktionsaufrufoperation ausführt, sucht ZE nach dem Funktionsnamen in der Funktionstabelle (wie oben erwähnt, wird der Funktionsname hier von str_tolower verarbeitet, daher ist der Funktionsname von PHP nicht groß- und kleinschreibungspflichtig). -sensitive) Die Definition der Funktion. Wenn sie nicht vorhanden ist, wird die
„Aufruf einer undefinierten Funktion xxx()“ gemeldet. Wenn sie vorhanden ist, wird der zend_function-Strukturzeiger der Funktion gemeldet zurückgegeben werden und dann anhand des Werts von function.type beurteilt werden. Unabhängig davon, ob es sich bei der Funktion um eine
interne Funktion
Ausführung der Funktion
Aufmerksame Leser bemerken möglicherweise, dass es beim Aufruf der Funktion und in der Funktionsdefinition in den obigen Opcodes einen „Funktionsnamen“ gibt. Tatsächlich ist der Benutzer
unterscheidet sich nicht von der Ausführung anderer Anweisungen. Im Wesentlichen unterscheiden sich die PHP-Anweisungen in der Funktion nicht von den PHP-Anweisungen außerhalb der Funktion. Der größte Unterschied im Funktionskörper selbst liegt in seiner Ausführungsumgebung. Das wichtigste Merkmal dieser „Ausführungsumgebung“ ist der Umfang der Variablen . Wie wir alle wissen, können innerhalb einer Funktion definierte Variablen nicht direkt außerhalb der Funktion verwendet werden und umgekehrt. Wenn die Funktion ausgeführt wird, müssen dann die Umgebungsinformationen vor dem Aufrufen der Funktion gespeichert werden. Nachdem die Funktion ausgeführt wurde, werden auch diese Umgebungsinformationen wiederhergestellt, sodass das gesamte Programm weiterhin ausgeführt werden kann. 内部函数的执行与用户函数不同。用户函数是php语句一条条“翻译”成op_line组成的一个op_array,而内部函数则是用C来实现的,因为执行环境也是C环境, 所以可以直接调用。如下面的例子: 生成的opcodes中,内部函数和用户函数的处理都是由DO_FCALL来进行的。而在其具体实现的zend_do_fcall_common_helper_SPEC()中, 则对是否为内部函数进行了判断,如果是内部函数,则使用一个比较长的调用 ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common .return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); 上面这种方式的内部函数是在zend_execute_internal函数没有定义的情况下。而在而在Zend/zend.c文件的zend_startup函数中, zend_execute_internal = NULL; 此函数确实被赋值为NULL。于是我们在if (!zend_execute_internal)判断时会成立,所以我们是执行那段很长的调用。 那么,这段很长的调用到底是什么呢?以我们常用的 count函数为例。在<<第一节 函数的内部结构>>中, 我们知道内部函数所在的结构体中 有一个handler指针指向此函数需要调用的内部定义的C函数。 这些内部函数在模块初始化时就以扩展的函数的形式加载到EG(function_table)。其调用顺序: php_module_startup --> php_register_extensions --> zend_register_internal_module 在standard扩展中。module的定义为: 从上面的代码可以看出,module->functions是指向basic_functions。在basic_functions.c文件中查找basic_functions的定义。 Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Aufrufs und Ausführungsprozesses benutzerdefinierter PHP-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!<?php
$foo = 'test';
print_r($foo);
?>
--> zend_register_module_ex --> zend_register_functions
zend_register_functions(NULL, module->functions, NULL, module->type TSRMLS_CC)zend_module_entry basic_functions_module = {
STANDARD_MODULE_HEADER_EX,
NULL,
standard_deps,
"standard", /* extension name */
basic_functions, /* function list */
... //省略}

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.
