这将如何自动加载功能


How will this autoload function?

这是我的自动加载器类。我从这周开始学习PHP。我有自动加载器的想法从不同的文章和PHP在行动书,但我不知道它实际上是如何工作的?

class autoloader {
    public static $loader;
    public static function init()
    {
        if(self::$loader == NULL) {
            self::$loader = new self();
        }
        return self::$loader;
    }   
    public function __construct()
    {
        spl_autoload_register(array(this, 'library'));
        spl_autoload_register(array(this, 'controller'));
        spl_autoload_register(array(this, 'helper'));
        spl_autoload_register(array($this, 'model'));
    }
    public function library($class) 
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/lib');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }
    public function controller($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/controller');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }
    public function helper($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/helper');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }
    public function model($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/model');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }
}

我想问一下这个自动装填机到底是怎么工作的?例如,如果我实例化一个类,它位于库文件夹下如何处理这个完整的文件?

首先,当你实例化一个类时,它的构造函数注册了四个处理类自动加载的函数。

$autoloader = new autoloader();

它们都将在自己的特定目录中查找文件。没有必要调用autoloader::init()函数,因为所有的autoloader函数都已经通过实例化类注册了。

然后,当您尝试实例化一个类时,如果PHP在错误失败之前找不到它,它将运行由spl_autoload_register()按照注册顺序注册的函数。(autoloader::library(), autoloader::controller(), autoloader::helper()和autoloader::model()),并且,如果该类之后可用,它将被实例化。

扩展您的示例,下面是一些代码片段:

<?php
include 'autoloader.php'; // in this file we have our autoloader class
$autoloader = new autoloader();
$libClass = new someLib();

当我们调用new someelib()时,PHP的自动加载机制将在include_path指令中提到的所有区域中查找文件' someelib . PHP'(!小写!)。你看,每个函数都将自己的位置添加到这个指令

set_include_path(get_include_path() . PATH_SEPARATOR . '/controller');

这意味着位于根目录中的名为'controller'的文件夹将被添加到include_path中,然后spl_autolload()将在其中查找文件。所以你需要创建文件/lib/someLib。php并创建一个名为'someLib'的类

希望有帮助

额外的阅读:spl_autoload_registerspl_autoload

@user991047作为初学者,我建议您清除类的概念和基于OOP的概念。如果你已经知道忽略建议

你提到的类主要用于基于PHP的MVC(模型视图辅助控制器)框架。框架是一组基于php的类,用于模型,助手和控制器,这些有助于加快应用程序开发,安全性,代码可重用性和更多…

对于使用PHP MVC框架的应用程序,需要设置这些类库的路径,以便用户可以开发自己的代码,而不必担心MVC库路径。这就是这门课的目的

你提到的自动加载器类包含方法

public static function init()

这个方法说明你可以通过实例化自动加载器类对象来直接调用这个方法。这个方法检查自动加载器类的对象是否被实例化。如果不是,则创建同一个类的对象,通过该对象可以访问类的方法。

构造函数在创建类的对象时被自动调用,因此它将注册所有四个方法

public function library($class) 
public function controller($class) 
public function helper($class) 
public function model($class) 

这些函数有助于对所有MVC类自动执行include_once()。

如果你不明白,仍然首先要清楚MVC模式。:)