Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Kern-detaillierte Erklärung von Klassen und objektorientiertem Code

PHP-Kern-detaillierte Erklärung von Klassen und objektorientiertem Code

黄舟
黄舟Original
2017-03-09 09:43:361349Durchsuche

Als ich zum ersten Mal mit PHP in Berührung kam, nutzte ich einen prozessorientierten Ansatz, um zum Spaß einige sehr einfache Websites zu erstellen, und schrieb einfach PHP Code-Stapelung, Skalierbarkeit und Wartbarkeit sind so schlecht, dass es äußerst umständlich ist, die Logik zu ändern. Später entdeckte ich, dass PHP objektorientiert ist, und plötzlich hatte ich das Gefühl, dass ich damals noch sehr jung und unwissend war. Schließlich ist PHP in C implementiert, was nicht überraschend ist.

Vorwort:

Von unserem Kontakt PHPDas erste, was uns begegnet, sind Funktionen: Array-Operationsfunktionen, String-Operationsfunktionen, Dateioperationsfunktionen usw. Diese Funktionen sind die Grundlage für unseren Einsatz von PHP und stellen auch die prozessorientierte Programmierung dar, die PHP seit seiner Geburt unterstützt. Prozessorientiert kapselt Funktionen einzeln und löst Probleme mit einer modularen Idee.

Objektorientierte Programmierung wird ab PHP4 unterstützt. Allerdings ist die objektorientierte Unterstützung von PHP4 nicht perfekt. Ab PHP5 hat PHP ein neues Objektmodell (Objektmodell) eingeführt und viele neue Funktionen hinzugefügt, darunter Zugriffskontrolle, abstrakte und endgültige Klassen, Klassenmethoden, magische Methoden, Schnittstellen, Objektklonen und Typhinweise usw. Und in der kürzlich veröffentlichten PHP5.3-Version gibt es Namespaces, verzögerte statische Bindung und zusätzliche Es gibt zwei magische Methoden __callStatic() und __aufrufen().

Wie wird es also unten in PHP implementiert und wie ist seine Struktur?

Eins. Klassenstruktur

Ein Beispiel für das Zitieren von TIPI:

class ParentClass {
}
 
interface Ifce {
        public function iMethod();
}
 
final class Tipi extends ParentClass implements Ifce {
        public static $sa = 'aaa';
        const CA = 'bbb';
 
        public function __constrct() {
        }
 
        public function iMethod() {
        }
 
        private function _access() {
        }
 
        public static function access() {
        }
}


Eine übergeordnete Klasse ParentClass, eine Schnittstelle Ifce und eine Unterklasse Tipi werden hier definiert. Die Unterklasse erbt die übergeordnete Klasse ParentClass, implementiert die Schnittstelle Ifce und verfügt über eine statische Variable $sa, eine Klassenkonstante CA, eine öffentliche Methode, eine private Methode und eine öffentliche statische Methode. Wie werden diese Strukturen innerhalb der Zend-Engine implementiert? Wie werden Klassenmethoden und Mitgliedsvariablen gespeichert? Zugriffskontrolle, wie werden statische Mitglieder markiert?

Schauen wir uns zunächst die interne Speicherstruktur der Klasse an:


Anhand einiger Felder der obigen Struktur analysieren wir die Leistung des PHP-Codes am Anfang des Artikels im Kernel. Wie unten gezeigt :

Dateinameline_startline_end


二。变量与成员变量

PHP内核的存储机制(分离/改变)所介绍,

变量要么是定义在全局范围中,叫做全局变量,要么是定义在某个函数中, 叫做局部变量。

成员变量是定义在类里面,并和成员方法处于同一层次。如下一个简单的PHP代码示例,定义了一个类, 并且这个类有一个成员变量。

class Tipi { 
	public $var;
}

1.成员变量的访问:

访问这个成员变量当然是通过对象来访问。

2.成员变量的规则:

1.接口中不允许使用成员变量

2.成员变量不能拥有抽象属性

3.不能声明成员变量为final

4.不能重复声明属性

在声明类的时候初始化了类的成员变量所在的HashTable,之后如果有新的成员变量声明时,在编译时zend_do_declare_property。函数首先检查成员变量不允许的这4 条情况。

比如:.

class Tipi { 
	public final $var;
}

运行程序将报错,违反了第三条:Fatal error: Cannot declare property Tipi::$var final, the final modifier is allowed only for methods and classes in .. 这个错误由zend_do_declare_property函数抛出


三。函数与成员方法

成员方法从本质上来讲也是一种函数,所以其存储结构也和常规函数一样,存储在zend_function结构体中。



对于一个类的多个成员方法,它是以HashTable的数据结构存储了多个zend_function结构体。 和前面的成员变量一样,在类声明时成员方法也通过调用zend_initialize_class_data方法,初始化了整个方法列表所在的HashTable。 在类中我们如果要定义一个成员方法,格式如下:

class Tipi{ 
     public function t() {echo 1; }
}


除去访问控制关键字,一个成员方法和常规函数是一样的,从语法解析中调用的函数一样(都是zend_do_begin_function_declaration函数), 但是其调用的参数有一些不同,第三个参数is_method,成员方法的赋值为1,表示它作为成员方法的属性。 在这个函数中会有一系统的编译判断,比如在接口中不能声明私有的成员方法。 看这样一段代码:

interface Ifce { 
    private function method();
}


Bei direkter Ausführung meldet das Programm einen Fehler: Schwerwiegender Fehler: Zugriffstyp für Schnittstellenmethode Ifce::method() muss in weggelassen werden. Dieser Code entspricht dem Code in der zend_do_begin_function_declaration Funktion.

Vier. Ähnlichkeiten und Unterschiede zwischen Methoden (Funktion) und Funktionen (Methode)


Die Implementierung von Funktionen wurde bereits früher vorgestellt Methoden sind ähnlich: Eine Reihe von Logiken werden zur Ausführung in eine Sammlung eingefügt, es gibt jedoch viele Unterschiede in der Verwendung der beiden. Hier diskutieren wir die Implementierung der beiden. Aus Sicht der Implementierung wird der interne Code beider letztendlich als op_array interpretiert, und es gibt keinen Unterschied in seiner Ausführung (es sei denn, objektspezifische Änderungen oder Methoden wie $this/self werden verwendet) und den Unterschied zwischen den beiden spiegelt sich in den beiden Aspekten wider:


1. Es ist die Umsetzung der Definition (Registrierung); 🎜>

2. Es ist die Umsetzung des Aufrufs

Implementierung der Definitionsmethode (Registrierung) Funktionen und Methoden werden während der Kompilierungsphase in der Variablen „compiler_globals“ registriert und von beiden verwendet Die gleichen Kernel-Verarbeitungsfunktionen zend_do_begin_function_declaration() und zend_do_end_function_declaration() vervollständigen diesen Prozess. Der interne Inhalt der beiden wird schließlich als op_codes-Array interpretiert und gespeichert, aber der „gemountete“ Speicherort nach der Kompilierung ist unterschiedlich, wie unten gezeigt:


Registrierungsort von Funktionen und Methoden in PHP


Implementierung des Aufrufs Methode


Der Unterschied im Definitionsort und in der Natur bestimmt, dass Methoden fortgeschrittener sind als Funktionen Überprüfungsarbeit, Methodenaufrufe haben einen weiteren OPCODE namens ZEND_INIT_METHOD_CALL , Die Funktion besteht darin, die Methode bei „execute_data.fbc“ zu registrieren, und dann können Sie dieselbe Verarbeitungsfunktion

ZEND_DO_FCALL_BY_NAME für die Verarbeitung verwenden.

Feldname Feldbeschreibung ParentClass-Klasse Ifce-Schnittstelle Tipi-Klasse
Name Klassenname ParentClass Ifce Tipi
Typ Kategorie 2 (benutzerdefiniert) 2 (benutzerdefiniert) 2 (benutzerdefiniert, 1 ist das vom System erstellte) in der Klasse)
Elternklasse Elternklasse Leer Leer Elternklasse
refcount Referenzanzahl 1 1 2
ce_flags Klassentyp 0 144 524352
function_table Funktionsliste Leer Funktionsname=iMethod |. type=258 Funktionsname=__construct | 2 |. fn_flags=65800
function_name=_access |function_name=access |. type=2 |. fn_flags=257
Schnittstellen Schnittstellenliste null Ifce-Schnittstellenschnittstellennummer ist 1
Speicherdateiadresse /tipi.php /tipi.php /ipi.php
Anzahl der Klassenstartlinien 15 18 22
Anzahl der Klassenendzeilen 16 20 38

Das obige ist der detaillierte Inhalt vonPHP-Kern-detaillierte Erklärung von Klassen und objektorientiertem Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn