这个自动加载功能如何?

时间:2011-10-13 11:14:37

标签: php

这是我的自动装载程序类。我从本周开始学习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);
    }
}

我想问一下这款自动加载器的功能究竟如何? 例如,如果我实现了一个位于lobrary文件夹下的类 如何处理这个完整的文件?

2 个答案:

答案 0 :(得分:3)

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

$autoloader = new autoloader();

每个人都会在自己的特定目录中查找文件。无需调用autoloader :: init()函数,因为所有自动加载函数都已通过实例化类注册。

然后,当你尝试实例化一个类时,如果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 someLib()时,PHP的自动加载机制将在include_path指令中提到的所有区域中查找文件'somelib.php'(!lowercase!)。你看,每个函数都将自己的位置添加到这个指令

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

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

希望这有帮助

补充阅读: spl_autoload_register spl_autoload

答案 1 :(得分:1)

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

您提到的类主要用于基于PHP的MVC(模型视图辅助控制器)框架。框架是基于PHP的模型,助手和控制器类的集合,有助于加快应用程序开发,安全性,代码重用性等等......

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

你提到的

autoloader类包含方法

public static function init()

此方法是可以通过实例化自动加载器类对象直接调用此方法的状态。此方法检查类自动加载器的对象是否已实例化?如果没有那么它会创建同一个类的对象,通过它可以访问类方法。

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

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

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

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