PHP类自动载入和PSR-0规范

xuebingnan 2019-06-27

PSR-0

PSR-0是php业界提出的一个大家共同遵循的规范,很多php框架都遵循PSR-0规范,它有三项约定:
  1. php的命名空间必须与绝对路径一致
  2. 类名的首字母必须大写
  3. 除入口文件外,其它的.php文件必须只有一个类

开发一个符合PSR-0规范的框架很简单,只要满足下面三个条件就可以了:

  1. 全部使用命名空间
  2. php类库文件自动载入,不能有include/require
  3. 保证有单一入口

类自动载入

SPL(Standard PHP Library)是php的标准拓展类库,php实现类自动载入推荐使用SPL提供的spl_autoload_register方法注册一个类自动载入函数。下面是一个简单的例子。

<?php
define('BASEDIR', __DIR__);
function autoload($class){
    require(BASEDIR.'/'.str_replace('\\','/',$class).'.php');
}
spl_autoload_register('autoload');
?>

简单例子

demo目录结构很简单,只包含唯一入口文件index.php。我把自动载入函数另外写到了SplAutoload文件夹下的一个类文件中,通过include_once引入到入口文件中实现类库的自动载入。

PHP类自动载入和PSR-0规范
自动载入函数写到了SplAutoload文件夹下的Autoload类中的一个方法里,根据前边讲到的规范,类的命名空间与绝对路径保持了一致。Autoload类源代码如下:

<?php
namespace SplAutoload;

class Autoload
{
    public static function load($class){
        require(BASEDIR.'/'.str_replace('\\','/',$class).'.php');
    }
}

其中自动载入函数load方法的参数$class其实是在类自动载入过程中,对载入类的唯一标识,它是一个带有命名空间的类名字符串。比如当APP\Controller文件夹下的LoginController类载入时,打印自动载入函数中参数值$class是:App\Controllers\LoginController。所以PSR-0中的规范约定:php的命名空间必须与绝对路径一致可以保证载入类的唯一性,避免混淆和重复载入相同的类导致的错误。
为了做演示,我们在APPControllers文件夹下新建了两个类文件:LoginController和UserController。它们中的内容很简单,只是打印信息,要注意它们符合PSR-0规范,所以命名空间的设置要符合标准。源代码如下:

<?php

namespace App\Controllers;

class UserController
{
   public function showMsg()
   {
       print_r('hello, i am guozhaoran');
   }
}
<?php

namespace App\Controllers;

class LoginController
{
  public function userLogin()
  {
      print_r('user has login<br/>');
  }
}

入口文件中的内容基本上和前边简单的例子一样,只是将自动载入函数写到了单独的文件里进行管理,在入口文件中直接调用指定类的中的方法就可以了,无需自动载入了。下面是入口脚本代码和演示结果:

<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/APP/Controller/loader.php';
spl_autoload_register('\\APP\\Controller\\Loader::autoload');

$handler = new App\Controller\GetPhoneMsg($_GET['mobile']);
$handler->queryMsg();

PHP类自动载入和PSR-0规范

至次,一个简单的符合PSR-0规范的实现类自动载入的PHP基础框架就搭建完成了!

相关推荐

JF0 / 0评论 2019-11-03