您的位置:首页 > 编程语言 > PHP开发

PSR-0 自动加载标准

2016-03-31 22:42 337 查看
从2014-10-21日起,PSR-0标准被标记为废弃。推荐使用PSR-4标准作为替换。

加载器(autoloader)必须遵循以下所下要求。

要求:

一个完整的命名空间或类必须拥有以下结构
\<Vendor Name>\(<Namespace>\)*<Class Name>


每一个命名空间必须有一个顶级的空间名(‘Vendor Name’)

每一个命名空间可以拥有多个子命名空间

从文件系统中加载时,命名空间中的分隔符(\)将被转化为文件分隔符

类名中的每一个
_
(下划线)将被转化为文件分隔符。命名空间中的
_
没有特殊含义

从文件系统中加载时,完整命名空间或类须以
.php
作为后缀名

开发商名、命名空间和类可以由大小写字母构成(区分大小写)

示例

\Doctrine\Common\IsolatedClassLoader=>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php


\Symfony\Core\Request=>/path/to/project/lib/vendor/Symfony/Core/Request.php


\Zend\Acl=>/path/to/project/lib/vendor/Zend/Acl.php


\Zend\Mail\Message=>/path/to/project/lib/vendor/Zend/Mail/Message.php


命名空间和类中的下划线

\namespace\package\Class_Name=>/path/to/project/lib/vendor/namespace/package/Class/Name.php


\namespace\package_name\Class_Name=>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php


这些应当是实现一个自动加载器的最低标准。你可以通过这个可以加载PHP 5.3类的自动加载器来实践下这些标准。

代码实现

<?php

function autoload($className)
{
$className = ltrim($className,'\\');//去除命名空间前面的反斜杠
$fileName  = '';
$namespace = '';
if($lastNsPos = strrpos($className,'\\')) {//类名前反斜杠的位置
$namespace = substr($className,0,$lastNsPos);//命名空间
$className = substr($className,$lastNsPos + 1);//类名
$fileName  = str_replace('\\',DIRECTORY_SEPARATOR,$namespace). DIRECTORY_SEPARATOR;//文件名
}
$fileName .= str_replace('_',DIRECTORY_SEPARATOR,$className). '.php';//标准中的要以.php作为后缀,类名的下划线需要转化为文件分隔符

require $fileName;
}
spl_autoload_register('autoload');


SplClassLoader 实现

下面是一个简单的SplClassLoader 实现,如果你遵循以上标准,你可以通过它来加载类。推荐使用PSR-0标准来加载 PHP 5.3的类

http://gist.github.com/221634(要翻墙???)

原文 阅读PSR-0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息