A brief discussion on PHP source code twenty-seven: PHP's identification of construction methods

不言
Release: 2023-04-02 06:26:02
Original
1983 people have browsed it

This article mainly introduces a brief discussion on PHP source code twenty-seven: PHP's identification of construction methods has a certain reference value. Now I share it with you. Friends in need can refer to it

Talking about PHP source code twenty-seven: PHP's identification of constructor methods
As we all know, due to historical reasons, PHP used to use the class name as the constructor, and the new constructor __construct was introduced in PHP5. For backward compatibility, if PHP 5 cannot find a __construct() function in a class, it will try to find an old-style constructor, which is a function with the same name as the class. Therefore, the only situation where compatibility issues will arise is if the class already has a method named __construct(), but it is not a constructor.
There is the following piece of code

<?php
class Foo {     
public function Foo() {     
}     
private function __construct() {     
}
} 
new Foo();
die();
Copy after login

At this time, the output is:

Fatal error: Call to private Foo::__construct() from invalid context

At this time, The constructor recognized by PHP is __construct. Because it is private, an error occurs when calling externally.

Okay, let’s find out the reason from the C source code of PHP.

Start by directly looking for the definition of the class in the extension class of spl:

 spl_iterators.c 3228行 REGISTER_SPL_STD_CLASS_EX(IteratorIterator, spl_dual_it_new, spl_funcs_IteratorIterator);///spl_functions.h 31行#define REGISTER_SPL_STD_CLASS_EX(class_name, obj_ctor, funcs) \
spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, funcs TSRMLS_CC);//spl_functions.c 41行PHPAPI void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * obj_ctor, const zend_function_entry * function_list TSRMLS_DC) //spl_functions.c 2235行ZEND_API zend_class_entry *zend_register_internal_class(zend_class_entry *orig_class_entry TSRMLS_DC) /* {{{ *///调用do_register_internal_class函数 //zend_API.c 2169行static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class_entry, zend_uint ce_flags TSRMLS_DC) /* {{{ *///调用zend_register_functions(class_entry, class_entry->builtin_functions, &class_entry->function_table, MODULE_PERSISTENT TSRMLS_CC); //zend_API.c 1795行/* Look for ctor, dtor, clone
* If it&#39;s an old-style constructor, store it only if we don&#39;t have
* a constructor already.
*/if ((fname_len == class_name_len) && !memcmp(lowercase_name, lc_class_name, class_name_len+1) && !ctor) {
ctor = reg_function;} else if ((fname_len == sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) && !memcmp(lowercase_name, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME))) {
ctor = reg_function;}  
scope->constructor = ctor;//在1961行 确认构造函数
Copy after login

The above code is the php5.3.0 version
From the above tracking process, when the program registers all functions, If __construct (i.e. ZEND_CONSTRUCTOR_FUNC_NAME) exists, the constructor of class_name (class name) will be overwritten so that it exists as a regular member function. The code is as follows:

<?php
class Foo {     
public function Foo() {
        echo &#39;Foo&#39;;
    }     public function __construct() {
        echo &#39;__construct&#39;;
    }} 
    $foo = new Foo();
    $foo->Foo();
Copy after login

For the error reported in the previous example, we can

##zend/zend_object_handlers.c line 1057

ZEND_API union _zend_function *zend_std_get_constructor(zval *object TSRMLS_DC )
Find the source.

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

A brief discussion on PHP source code twenty-six: Simplification of PHP quick sort source code implementation

A brief discussion PHP source code twenty-five: About next, current, key functions

The above is the detailed content of A brief discussion on PHP source code twenty-seven: PHP's identification of construction methods. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this 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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template