PHP underlying principles, classes and objects
##For PHPer, OOP is indispensable Development thinking, but how much do you know about the underlying implementation of PHP classes and objects? Based on the idea of knowing what is happening and knowing why, let us find the answer together~The underlying implementation of the class can be regarded as the knowledge collection of variables, functions, etc. we have talked about before. Therefore, students who want to understand more deeply should check out my previous articles about introducing variables and functionsClass data structureWhether it is an ordinary class, an abstract class or an interface, all Stored in a unified structure, and when generating intermediate code, this class will be added to the global class list. Of course, at this time, the class name will be used to determine whether the class already exists. If it exists, the addition will fail
struct _zend_class_entry { char type; // 和函数一样,类被拆分为两种类型:ZEND_INTERNAL_CLASS 内部类型和ZEND_USER_CLASS 用户自定义类型 char *name;// 类名称 zend_uint name_length; // 即sizeof(name) - 1 struct _zend_class_entry *parent; // 继承的父类 int refcount; // 引用数 zend_bool constants_updated; zend_uint ce_flags; //类的类型,在编译阶段被区分是普通类,接口,抽象类 HashTable function_table; // 静态类方法和普通类方法存放集合 HashTable default_properties; // 默认属性存放集合 HashTable properties_info; // 属性信息存放集合 HashTable default_static_members;// 类本身所具有的静态变量存放集合 HashTable *static_members; // type == ZEND_USER_CLASS时,取&default_static_members; // type == ZEND_INTERAL_CLASS时,设为NULL HashTable constants_table; // 常量存放集合 struct _zend_function_entry *builtin_functions;// 方法定义入口 /* 魔术方法 */ //所有魔术方法单独存放,初始化时被设置为null union _zend_function *constructor; union _zend_function *destructor; union _zend_function *clone; union _zend_function *__get; union _zend_function *__set; union _zend_function *__unset; union _zend_function *__isset; union _zend_function *__call; union _zend_function *__tostring; union _zend_function *serialize_func; union _zend_function *unserialize_func; zend_class_iterator_funcs iterator_funcs;// 迭代 /* 类句柄 */ zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC); zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, intby_ref TSRMLS_DC); /* 类声明的接口 */ int(*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type TSRMLS_DC); /* 序列化回调函数指针 */ int(*serialize)(zval *object, unsignedchar**buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); int(*unserialize)(zval **object, zend_class_entry *ce, constunsignedchar*buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); zend_class_entry **interfaces; // 类实现的接口 zend_uint num_interfaces; // 类实现的接口数 char *filename; // 类的存放文件地址 绝对地址 zend_uint line_start; // 类定义的开始行 zend_uint line_end; // 类定义的结束行 char *doc_comment; zend_uint doc_comment_len; struct _zend_module_entry *module; // 类所在的模块入口:EG(current_module) };
The first step: Find whether the class exists in the global class list according to the class name. If If it exists, get the variable of the storage class
Step 2: Determine whether the class is a normal class (non-abstract class or interface); if it is a normal class, allocate memory to the zval container where the object to be created is stored, and set the container type For IS_OBJECT
Step 3: Perform object initialization operation and add the object to the global object list (object pool)
typedef struct _zend_object { zend_class_entry *ce; //对象的类结构 HashTable *properties; //对象属性 HashTable *guards; /* protects from __get/__set ... recursion */ } zend_object;
The first step is to get the properties of the object. Find whether there is an attribute corresponding to the name from the properties of the object. If it exists, return the result. If it does not exist, go to the second step
The second step, if there is a get magic method, call this method to get the variable. If it does not exist, an error will be reported.
The first step, get the properties of the object, from the object's properties looks up whether there is a property corresponding to the name. If it exists and the existing value is the same as the value that needs to be set, no operation is performed. Otherwise, the variable assignment operation is performed. If it does not exist, go to the second step
Step 2 , if the _set magic method exists, call this method to set the variable. If it does not exist, go to the third step
The third step, if the member variable has not been set, directly add this variable to the properties field of the object Located in HashTable.
For more PHP-related technical articles, please visit PHP Tutorial column to learn!
The above is the detailed content of PHP underlying principles, classes and objects. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
