这是我的自动装载程序类。我从本周开始学习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文件夹下的类 如何处理这个完整的文件?
答案 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'的类
希望这有帮助
答案 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模式。 :)