类自动载入、开发一个PSR-0的基础框架

来源:互联网 发布:淘宝客怎么算恶意下单 编辑:程序博客网 时间:2024/06/03 05:13

类自动载入

最早的php项目都是通过手动include或者require来载入依赖的文件的,当项目越来越大,依赖越来越多,这样开发就很不方便了。

<?phprequire 'Test1.php';require 'Test2.php';Test1::test();Test2::test();

PHP5.2就提供了类的自动载入功能。

<?phpTest1::test();Test2::test();function __autoload($className){    require __DIR__.'/'.$className.'.php';}

最早的时候我通过__autoload这个魔术函数,从上面代码,我们可以看出,我们没有手动引入Test1Test2,那是因为__autoload函数帮我完成了这一步。

但是__autoload之后被废弃了。主要原因是我们一个php工程可能依赖于多个框架,如果我们每一个框架都有这个函数,就会报一个“函数重复定义”的错误。

在PHP5.3之后,官方提供了另一个函数:spl_autoload_register

<?phpspl_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:

<?phpnamespace 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();
0 0
原创粉丝点击