类自动载入
最早的php项目都是通过手动include
或者require
来载入依赖的文件的,当项目越来越大,依赖越来越多,这样开发就很不方便了。
<?php
require 'Test1.php';
require 'Test2.php';
Test1::test();
Test2::test();
PHP5.2就提供了类的自动载入功能。
<?php
Test1::test();
Test2::test();
function __autoload($className){
require __DIR__.'/'.$className.'.php';
}
最早的时候我通过__autoload
这个魔术函数,从上面代码,我们可以看出,我们没有手动引入Test1
和Test2
,那是因为__autoload
函数帮我完成了这一步。
但是__autoload
之后被废弃了。主要原因是我们一个php工程可能依赖于多个框架,如果我们每一个框架都有这个函数,就会报一个“函数重复定义”的错误。
在PHP5.3之后,官方提供了另一个函数:spl_autoload_register
<?php
spl_autoload_register('autoload1');
spl_autoload_register('autoload2');
Test1::test();
Test2::test();
function autoload1($className){
require __DIR__.'/'.$className.'.php';
}
function autoload2($className){
require __DIR__.'/'.$className.'.php';
}
开发一个PSR-0的基础框架
PSR-0规范:
1、命令空间必须和绝对路径一致
2、类名的首字母必须大写
3、除了入口文件外,其他.php
必须只有一个类
开发符合RSR-0规范的基础框架:
1、全部使用命名空间
2、所有PHP文件必须自动载入,不能有include或require
3、单一入口
如果我们想在入口文件index.php中调用2个命令空间下的类方法
IMooc\Object::test();
App\Controller\Home\Index::test();
这个时候,怎么自动加载我们需要的类呢?Loader.php
就上场了。
Loader.php:
<?php
namespace IMooc;
class Loader
{
static function autoload($className)
{
// 映射成文件的绝对路径
$file = BASEDIR.'/'.str_replace('\\','/',$className).'.php';
//echo $file;
require $file;
}
}
所以我们只需要在入口文件引入这个Loader.php文件,并且用spl_autoload_register
函数注册,就实现了所有类的自动载入。
<?php
// 定义根目录
define('BASEDIR', __DIR__);
include BASEDIR.'/IMooc/Loader.php';
spl_autoload_register('\\IMooc\Loader::autoload');
IMooc\Object::test();
App\Controller\Home\Index::test();