PSR-0
PSR-0是php业界提出的一个大家共同遵循的规范,很多php框架都遵循PSR-0规范,它有三项约定:
- php的命名空间必须与绝对路径一致
- 类名的首字母必须大写
- 除入口文件外,其它的.php文件必须只有一个类
开发一个符合PSR-0规范的框架很简单,只要满足下面三个条件就可以了:
- 全部使用命名空间
- php类库文件自动载入,不能有include/require
- 保证有单一入口
类自动载入
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引入到入口文件中实现类库的自动载入。
自动载入函数写到了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();
至次,一个简单的符合PSR-0规范的实现类自动载入的PHP基础框架就搭建完成了!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。