Maison développement back-end tutoriel php Explication détaillée du noyau PHP des classes et du code orienté objet

Explication détaillée du noyau PHP des classes et du code orienté objet

Mar 09, 2017 am 09:43 AM

Quand je suis entré en contact avec PHP pour la première fois, j'ai utilisé une approche orientée processus pour créer des sites Web très simples pour le plaisir, et j'ai simplement écrit PHP L'empilement, l'évolutivité et la maintenabilité sont si médiocres qu'il est extrêmement gênant de changer la logique. Plus tard, j'ai découvert que PHP supportait l'orientation objet, et du coup j'ai senti que j'étais vraiment jeune et ignorant à cette époque. Après tout, PHP est implémenté en C, ce qui n'est pas surprenant.

Avant-propos :

De notre contact PHPAu départ, la première chose que nous rencontrons, ce sont les fonctions : fonctions d'opération sur tableau, fonctions d'opération sur chaîne, fonctions d'opération sur fichier, etc. Ces fonctions sont la base de notre utilisation de PHP, et elles constituent également la programmation orientée processus que PHP prend en charge depuis sa naissance. Orienté processus, il encapsule les fonctions une par une et résout les problèmes avec une idée modulaire.

La programmation orientée objet est supportée depuis PHP4. Cependant, le support orienté objet de PHP4 n'est pas parfait. À partir de PHP5, PHP a introduit un nouveau modèle objet (Object Model) et ajouté de nombreuses nouvelles fonctionnalités, notamment le contrôle d'accès, les classes abstraites et finales, les méthodes de classe, les méthodes magiques, les interfaces, le clonage d'objets et les astuces de type, etc. Et dans la version PHP5.3 récemment publiée, les espaces de noms, la liaison statique retardée et supplémentaires. Il existe deux méthodes magiques __callStatic() et __invoquer().

Alors, comment est-il implémenté au bas de PHP et quelle est sa structure ?

Un. Structure de classe

Un exemple de citation de 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() {
        }
}
Copier après la connexion


Une classe parent ParentClass, une interface Ifce et une sous-classe Tipi sont définies ici. La sous-classe hérite de la classe parent ParentClass, implémente l'interface Ifce et possède une variable statique $sa, une constante de classe CA, une méthode publique, une méthode privée et une méthode statique publique. Comment ces structures sont-elles implémentées dans le moteur Zend ? Comment les méthodes de classe et les variables membres sont-elles stockées ? Contrôle d'accès, comment les membres statiques sont-ils marqués ?

Tout d'abord, regardons la structure de stockage interne de la classe :


En prenant quelques champs de la structure ci-dessus, nous analysons les performances du code PHP au début de l'article dans le noyau. Comme indiqué ci-dessous  :

Nom du champDescription du champClasse ParentClassInterface IfceClasse Tipi
nomNom de la classeParentClassIfceTipi
typecatégorie2 (défini par l'utilisateur)2 (défini par l'utilisateur)2 (défini par l'utilisateur, 1 est le système construit- en classe)
parentClasse ParentVideVideClasse Parent
refcountNombre de références112
ce_flagsType de classe0144524352
function_tableListe des fonctions Videfunction_name=iMethod | type=2 | fn_flags=258function_name=__construct | 2 | fn_flags=65800
nom_fonction=_access type=2 |function_name=access | type=2 | fn_flags=257
interfacesListe des interfacesnullnullLe numéro d'interface de l'interface Ifce est 1
nom de fichierAdresse du fichier de stockage/tipi.php/tipi.php /ipi.php
line_startNombre de lignes de départ de classe1518 22
line_endNombre de lignes de fin de classe162038


二。变量与成员变量

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

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

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

class Tipi { 
	public $var;
}
Copier après la connexion

1.成员变量的访问:

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

2.成员变量的规则:

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

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

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

4.不能重复声明属性

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

比如:.

class Tipi { 
	public final $var;
}
Copier après la connexion

运行程序将报错,违反了第三条: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; }
}
Copier après la connexion


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

interface Ifce { 
    private function method();
}
Copier après la connexion


S'il est exécuté directement, le programme signalera une erreur : Erreur fatale : Type d'accès pour la méthode d'interface Ifce::method() doit être omis dans Ce code correspond au code dans la zend_do_begin_function_declaration fonction.

Quatre. Similitudes et différences entre les méthodes (Fonction) et les fonctions (Méthode)


L'implémentation des fonctions a été introduite plus tôt. méthodes consiste à comparer De même, une série de logiques est mise dans une collection pour exécution, mais il existe de nombreuses différences dans l'utilisation des deux. Nous discutons ici de la mise en œuvre des deux. Du point de vue de l'implémentation, le code interne des deux est finalement interprété comme op_array, et il n'y a aucune différence dans son exécution (sauf si des modifications spécifiques à l'objet ou des méthodes telles que $this/self sont utilisées), et la différence entre les deux se reflète dans les deux Aspects :


1 C'est la mise en œuvre de la définition (enregistrement) ; 🎜>


2. C'est la mise en œuvre de l'appel

Implémentation de la méthode de définition (enregistrement) Les fonctions et méthodes sont enregistrées dans la variable compiler_globals pendant la phase de compilation, et toutes deux utilisent les mêmes fonctions de traitement du noyau zend_do_begin_function_declaration() et zend_do_end_function_declaration() pour terminer ce processus. Le contenu interne des deux sera finalement interprété et stocké sous forme d'un tableau op_codes, mais l'emplacement "monté" après compilation est différent, comme indiqué ci-dessous :


Localisation d'enregistrement des fonctions et méthodes en PHP


Implémentation de l'appel méthode


La différence dans l'emplacement et la nature de la définition détermine que les méthodes sont plus avancées que les fonctions Plus travail de vérification, les appels de méthode ont un OPCODE supplémentaire nommé ZEND_INIT_METHOD_CALL ,

La fonction consiste à enregistrer la méthode dans execute_data.fbc, puis vous pouvez utiliser la même fonction de traitement

ZEND_DO_FCALL_BY_NAME pour le traitement.


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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles