Home  >  Article  >  Backend Development  >  Let’s talk about PHP’s autoLoad automatic loading mechanism_PHP tutorial

Let’s talk about PHP’s autoLoad automatic loading mechanism_PHP tutorial

WBOY
WBOYOriginal
2016-07-21 15:15:24803browse

How to use __autoload 1:
The most commonly used method is to find the class file based on the class name, and then require_one

Copy code The code is as follows:

function __autoload($class_name) {
$path = str_replace('_', '/', $class_name);
require_once $path . '.php';
}
// The Http/File/Interface.php file will be automatically loaded here
$a = new Http_File_Interface();

This method The advantage is that it is simple and easy to use. Of course, there are also disadvantages. The disadvantage is that the class name and file path are forced to be agreed. When the file structure is modified, the class name must be modified.

How to use __autoload 2 (direct mapping method)
Copy code The code is as follows:

$map = array(
'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php'
);
function __autoload($class_name) {
if (isset($map[$class_name])) {
require_once $map[$class_name];
}
}
// C:/PHP/HTTP/FILE/ will be automatically loaded here Interface.php file
$a = new Http_File_Interface();


The advantage of this method is that the class name and file path are only maintained with a mapping, so when the file structure changes At this time, there is no need to modify the class name, you only need to modify the corresponding item in the mapping.

The disadvantage of this method compared to the previous method is that it is very troublesome to maintain this mapping when there are too many files. Maybe at this time you will consider using json or a separate file for maintenance. Maybe you would think of using a framework to maintain or create such a mapping.

spl_autoload

The biggest flaw of __autoload is that it cannot have multiple autoload methods

Okay, think about the following scenario, your project references If you have copied someone else's project, your project has an __autoload, and someone else's project also has an __autoload, so the two __autoloads conflict. The solution is to modify __autoload to become one, which is undoubtedly very cumbersome.

Therefore, we urgently need to use an autoload call stack, so that the autoload series functions of spl appear. You can use spl_autoload_register to register multiple custom autoload functions

If your PHP version is greater than 5.1, you can use spl_autoload

First understand several functions of spl:
Let’s talk about PHP’s autoLoad automatic loading mechanism_PHP tutorial

spl_autoload is the default implementation of _autoload(), it will look for $class_name(.php/.inc) in include_path
Spl_autoload implements automatic loading:
Copy code The code is as follows:

/*http.php*/
class http
{
public function callname(){
echo "this is http";
}
}
/*test.php*/
set_include_path("/home/yejianfeng /handcode/"); //Here you need to put the path into include
spl_autoload("http"); //Look for /home/yejianfeng/handcode/http.php
$a = new http();
$a->callname();


Spl_autoload_register

Register the function into the SPL __autoload function stack, look at an example directly:
Copy code The code is as follows:

/*http.php*/
class http
{
public function callname(){
echo "this is http";
}
}

/*test.php*/
spl_autoload_register(function($class){
if($class == 'http'){
require_once("/home/yejianfeng/handcode/http.php");
}
}) ;

$a = new http();
$a->callname();


spl_autoload_call

Call spl_autoload_register to register To call the function, see the example below
Copy the code The code is as follows:

/*http.php*/
class http
{
public function callname(){
echo "this is http";
}
}
/*http2.php*/
class http
{
public function callname(){
echo "this is http2";
}
}

/ *test.php*/
spl_autoload_register(function($class){
if($class == 'http'){
require_once("/home/yejianfeng/handcode /http.php");
}
if($class == 'http2'){
require_once("/home/yejianfeng/handcode/http2.php");
}
});
spl_auto_call('http2');
$a = new http();
$a->callname(); //This will output "this is http2"

The spl_auto_register function makes it possible for us to use a custom function for automatic loading without using __autoload. This method is now commonly used.
Zend’s AutoLoader module uses this method. Excerpt the corresponding code
Copy the code The code is as follows:

spl_autoload_register(array(__CLASS__, 'autoload'));

public static function autoload($class)
{
…..

}


Suggested reference article:
Regarding zend’s autoload mechanism, there is a detailed analysis in the previous article http://www.jb51.net/article/31399.htm.
Regarding the automatic loading mechanism of autoload, this article http://www.jb51.net/article/31279.htm explains it in great detail, starting from the bottom layer.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/326121.htmlTechArticleHow to use __autoload 1: The most commonly used method is to find the class file based on the class name. Then require_one copy the code as follows: function __autoload($class_name)...
Statement:
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