php的自动加载:
在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,非常麻烦。
后来自从php5之后,对这个需求做了改进,如果当前没有include进来,系统能自动去找到该类,自动引进~
于是:__autoload()函数应运而生。
实例如下A:
index文件如下:
通过单一入口调用其他类的方法,类不存在则会自动引入
$a=new Test();
function __autoload($class)
{
require __DIR__.'/'.$class.'.php';
}
注意:这是最早的方式,但是已经被废弃,因为一个php工程可能需要依赖多个框架,
但是如果每个框架或者工程都加载这个函数的话,就会冲突,报错,函数重复。
后来自从5.3之后,出现了spl_autoload_register()这个函数,来进行类自动引入,,允许这个引入函数重复。
实例如下B:
spl_autoload_register('autoload');
spl_autoload_register('autoload1');
function autoload($class)
{
require __DIR__.'/'.$class.'.php';
}
function autoload1($class)
{
require __DIR__.'/'.$class.'.php';
}
Test3::test();
Test4::test();
//允许多个引入重复,我通过调用类,来引入多个文件,但最终都是调用一次
这2个还不够,但是如果我如果要写一个php框架的话,通过单一入口的方式,访问某个类文件,那么我该把这个函数做成一个类,做成路由,通过这个路由,来加载和使用文件。
实例C:
单一入口:index.php
<?php
define('BASEDIR', __DIR__);
include BASEDIR.'/IMooc/Loader.php';
spl_autoload_register('\\IMooc\\Loader::autoload'); ?>
路由类加载类:Loader.php
<?php
namespace IMooc;
class Loader
{
static function autoload($class)
{
// echo BASEDIR.'/'.str_replace('\\','/',$class).'.php';
//把命名空间的路径替换成正式路径即可
require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}