PHP core-detailed explanation of classes and object-oriented code
黄舟
Release: 2023-03-06 13:18:02
Original
1373 people have browsed it
When I first came into contact with PHP, I used a process-oriented approach to make some very simple websites for fun. Writing PHP code was Stacking, scalability and maintainability are so poor that it is extremely inconvenient to change the logic. Later I discovered that PHP supports object-oriented, and suddenly I felt that I was really young and ignorant at that time. After all, PHP is implemented in C, which is not surprising.
Foreword:
From our contact PHPStarting, the first thing we encounter are functions: array operation functions, string operation functions, file operation functions, etc.
These functions are the basis for our use of PHP, and they are also the process-oriented programming that PHP has supported since its birth. Process-oriented encapsulates functions one by one and solves problems with a modular idea.
# Supports object-oriented programming starting from PHP4. However, PHP4's object-oriented support is not perfect. Starting from PHP5, PHP has introduced a new object model (Object Model) and added many new features, including access control, abstract and final classes, class methods, magic methods, interfaces, object cloning and type hints, etc. And in the recently released PHP5.3 version, namespaces, delayed static binding and additional There are two magic methods __callStatic() and __invoke().
#So, how is it implemented at the bottom of PHP and what is its structure?
one. Class structure
Quoting an example of 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() {
}
}
Copy after login
A parent class ParentClass, an interface Ifce, and a subclass Tipi are defined here. The subclass inherits the parent class ParentClass, implements the interface Ifce, and has a static variable $sa, a class constant CA, a public method, a private method and a public static method. How are these structures implemented inside the Zend engine? How are class methods and member variables stored? Access control, how are static members marked?
First, let’s look at the internal storage structure of the class:
Taking some fields of the above structure, we analyze the performance of the PHP code at the beginning of the article in the kernel. As follows:
运行程序将报错,违反了第三条:Fatal error: Cannot declare property Tipi::$var final, the final modifier is allowed only for methods and classes in .. 这个错误由zend_do_declare_property函数抛出
If run directly, the program will report an error: Fatal error: Access type for interface method Ifce::method() must be omitted in This code corresponds to the code in the zend_do_begin_function_declaration function.
Four. Similarities and Differences between Method and Method Similarly, a series of logic is put into a collection for execution, but there are many differences in the use of the two. Here we discuss the implementation of the two. From an implementation point of view, the internal code of both is ultimately interpreted as op_array, and there is no difference in its execution (unless object-specific changes or methods such as $this/self are used), and the difference between the two is reflected in the two Aspects:
1. It is the implementation of definition (registration);
2. It is the implementation of the call;
## Implementation of the definition (registration) method
Functions and methods are registered in the compiler_globals variable during the compilation phase, and both use the same kernel processing functions zend_do_begin_function_declaration() and zend_do_end_function_declaration() to complete this process. The internal contents of the two will be eventually interpreted and stored as an op_codes array, but the "mounted" location after compilation is different, as shown below:
Registration location of functions and methods in PHP
Implementation of calling method
The difference in definition location and nature determines that methods are more complex than functions. More verification work, the method call has one more OPCODE named ZEND_INIT_METHOD_CALL
, than the function call Its function is to register the method to execute_data.fbc, and then you can use the same processing function as the function ZEND_DO_FCALL_BY_NAME
for processing.
The above is the detailed content of PHP core-detailed explanation of classes and object-oriented code. For more information, please follow other related articles on the PHP Chinese website!
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn