Home  >  Article  >  Backend Development  >  In-depth study of PHP automatic loading mechanism

In-depth study of PHP automatic loading mechanism

伊谢尔伦
伊谢尔伦Original
2017-07-01 09:59:411941browse

This article is a detailed analysis and introduction to the phpautomatic loading mechanism. Friends who need it can refer to it

1. Automatic loading in php Method
1. Use require, include, require_once, include_once to load manually.
2. Use autoload for automatic loading
3. Use spl's autoload for automatic loading
Implementation of manual loading:

We can use it when there are few files to be loaded. Be the first to finish. It's easy and no problem to do so.

The code is as follows:

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';


But is this okay when there are many files to be loaded? What should we do when we need to write ten, twenty require_once or more?

At this time we can use the autoload method to simplify our code.

Implementation of autoload loading:
We create an in.php file in the test directory with the following content.

The code is as follows:

echo &#39;我是test下面的in.php<br />&#39;;

Then create a loader.php in the test directory with the following content.

The code is as follows:

// 需要重载autoload方法,自定义包含类文件的路径  
function autoload($classname)  
{  
 $class_file = strtolower($classname).".php";  
 if (file_exists($class_file)){  
  require_once($class_file);  
 }  
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>


No problem, successful! We can also create other files for loading, but what should we do when there are many files required and need to be divided into directories?

At this time we need to modify loader.php to use mapping to find the file to be loaded.

The code is as follows:

function autoload($class_name) {
 $map = array(
  &#39;index&#39; => &#39;./include/index.php&#39;,
  &#39;in&#39; => &#39;./in.php&#39;
 );
    if (file_exists($map[$class_name]) && isset($map[$class_name])) {
        require_once $map[$class_name];
    }
}
new index();


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, no modification is required. For the class name, you only need to modify the corresponding item in the mapping.

But autoload can only be used once in a project. When your project references a project of others, there is an autoload in your project, and there is also an autoload in other people's projects, so the two autoloads conflict. The solution is to modify autoload to become one. This is undoubtedly very cumbersome and has a single application scenario.

spl's autoload loading implementation:
spl's autoload series of functions use an autoload call stack. You can use spl_autoload_register to register multiple custom autoload functions , Wide range of application scenarios

•Create in.php in the test directory with the following content

The code is as follows:

<?php
class in {
 public function index() {
  echo &#39;我是test下面的in.php&#39;;
 }
}
?>


Create loader.php in the test directory with the following content

The code is as follows:

<?php
set_include_path("/var/www/test/"); //这里需要将路径放入include
spl_autoload("in"); //寻找/var/www/test/in.php
$in = new in();
$in->index();


•spl_autoload_register registers the function to SPL autoload In the function stack, modify the code of loader.php

as follows:

function AutoLoad($class){
    if($class == &#39;in&#39;){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register(&#39;AutoLoad&#39;);
$a = new in();
$a->index();


•spl_autoload_register registers the application of multiple custom autoload functions
First in the test directory Create the mods folder and create inmod.mod.php with the following content:

The code is as follows:

<?php
class inmod
{
 function construct()
 {
  echo &#39;我是mods下的in&#39;;
 }
}


Then create the libs folder in the test directory and create inlib.lib The content of .php is as follows:

The code is as follows:

<?php
class inlib
{
 function construct()
 {
  echo &#39;我是libs下的in&#39;;
 }
}


Finally, create loader.php in the test directory. The content is as follows

The code is as follows:

<?php
class Loader {
    /**
    * 
自动加载类
    * @param $class 类名
    */
    public static function mods($class) {
        if($class){
   set_include_path( "/var/www/test/mods/" );
   spl_autoload_extensions( ".mod.php" );
   spl_autoload( strtolower($class) );
        }
    }
    public static function libs($class) {
  if($class){
   set_include_path( "/var/www/test/libs/" );
   spl_autoload_extensions( ".lib.php" );
   spl_autoload( strtolower($class) );
        }
    }
}
spl_autoload_register(array(&#39;Loader&#39;, &#39;mods&#39;));
spl_autoload_register(array(&#39;Loader&#39;, &#39;libs&#39;));
new inmod();//输出<SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是libs下的in</SPAN>

The above is the detailed content of In-depth study of PHP automatic loading mechanism. For more information, please follow other related articles on the PHP Chinese website!

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