一、什么是类的自动加载
类的自动加载就是我们在实例化一个类的时候,不需要每次都手动去'require'来这个类文件,程序自动帮我们加载导入进来。
类的自动加载是现在框架的根基,任何框架或者架构都会用到它。
主要是人懒
二、魔术方法__autoload
//定义一个函数,功能自动加载类文件,它自己会以类的名称作为参数
function autoload($class){
//类文件的地址,类文件的格式是$class.class.php
$classPath = str_replace('\\','/',__DIR__).'/'.$class.'.class.php';
//var_dump($classPath);
if(file_exists($classPath)){
include_once $classPath;
}
}
三、spl_autoload_register()
如果项目小,使用__autoload()
就能实现基本的自动加载。但是有些时候我们需要不同的自动加载方法来加载不同路径的类文件。
spl_autoload_register()
提供了一种更加灵活、效率更好的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用
function load($className)
{
require $className . '.php';
}
spl_autoload_register('load'); //将load函数注册到自动加载队列中。
$db = new DB(); //找不到DB类,就会自动去调用刚注册的load1函数了
类中的是使用
class MyClass{
public function loadFunction($class){
$classPath = str_replace('\\','/',__DIR__).'/'.$class.'.class.php';
if(file_exists($classPath)){
include_once $classPath;
}
}
public function register(){
//注册自动加载方法loadFunction
spl_autoload_register('self::loadFunction');
//或者参数为数组,数组的第一个元素为类名,第二个为要注册的方法名
//spl_autoload_register(array('MyClass','loadFunction'));
}
}
// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
其他使用场景
//静态调用
class demo
{
public static function myload(){}
public static function run()
{
spl_autoload_register([__class__,'myload']);
}
}
demo::run();
//非静态方法
class demo
{
public function myload(){}
public function run()
{
spl_autoload_register([$this,'myload']);
}
}
$d = new demo();
$d->run();
需要注意的是,如果你同时使用spl_autoload_register和autoload,autoload会失效!!!
四、多个spl_autoload_register的使用
执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止
五、类自动加载和namespace命名空间 的使用
index.php
/**
请求地址:index.php?c=index&a=index
app
-- model
-- controller
-- view
*/
$c = 'Index';
$a = 'Index';
# 定义主目录
defined('JK_ROOT') or define('JK_ROOT',__DIR__ );
require_once JK_ROOT . DIRECTORY_SEPARATOR .'loading.php';
spl_autoload_register('Loading::load');
$c = '\controller\\'.$c.'Controller';
$contr = new $c();
\controller\IndexController::talk();
loading.php
class Loading
{
public static function load($className)
{
//兼容linux
$classPath = str_replace('\\',DIRECTORY_SEPARATOR,$className);
$classFile = $classPath.'.php';
if( file_exists($classFile)){
require_once $classFile;
}else{
exit($className . '不存在');
}
}
}
app\controller\IndexController.php
namespace controller;
class IndexController
{
public function Index()
{
return 'hello world!';
}
public static function talk()
{
echo 'my name jack!';
}
}