专栏首页Web技术布道师PHP规范PSR0和PSR4的理解

PHP规范PSR0和PSR4的理解

一、PSR0简介 下文描述了若要使用一个通用的自动加载器(autoloader),你所需要遵守的规范: 一个完全标准的命名空间(namespace)和类(class)的结构是这样的:\<Vendor Name>\(<Namespace>\)*<Class Name> 每个命名空间(namespace)都必须有一个顶级的空间名(namespace)("组织名(Vendor Name)")。 每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)。 从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR。 类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。下划线_在空间名(namespace)中没有什么特殊的意义。 完全标准的命名空间(namespace)和类(class)从文件系统加载源文件时将会加上.php后缀。 组织名(vendor name),空间名(namespace),类名(class name)都由大小写字母组合而成。 参考:http://www.php-fig.org/psr/psr-0/ 以下,列出PSR0构建的规范类的几种形式:

二、实现PSR0自动加载

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';

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

三、PSR4简介 这个 PSR 描述的是通过文件路径自动载入类的指南;它作为对 PSR-0 的补充;根据这个 指导如何规范存放文件来自动载入; 术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构; 完全限定类名应该类似如下范例: <NamespaceName>(<SubNamespaceNames>)*<ClassName> 完全限定类名必须有一个顶级命名空间(Vendor Name); 完全限定类名可以有多个子命名空间; 完全限定类名应该有一个终止类名; 下划线在完全限定类名中是没有特殊含义的; 字母在完全限定类名中可以是任何大小写的组合; 所有类名必须以大小写敏感的方式引用; 当从完全限定类名载入文件时: 在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。 在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配; 终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配; 自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值; 参考:http://www.php-fig.org/psr/psr-4/ 在其中有以下的类实例,但是相对与PSR0,却是不太容易明白

首先,\Symfony\Core\Request和\Zend\Acl很好理解,其满足PSR0规范,但是\Acme\Log\Writer\File_Writer就不太好理解了。 四、Composer对PSR4的处理 看了Composer对PSR4的处理,才能比较容易理解PSR4。自动生成的PSR4配置文件名称为autoload_psr4.php(PSR0的是autoload_namespace.php),配置文件返回一个关联数组,键是名称空间的前缀,值是名称空间前缀对应的路径。 以\Acme\Log\Writer\File_Writer作为例子,其名称空间前缀是\Acme\Log\Writer,则其在autoload_psr4.php表示为 '\<span style="font-size:14px;">\Acme\\Log\\Writer</span>' => (array) './acme-log-writer/lib/' 使用自动加载时,先通过名称空间的前缀,找到对应的映射路径,在根据PSR0规范找到对应的类定义文件。但是这里有些例外,类名中的下划线在PSR4中是不需要转换成目录的。 使用PSR4,我觉得有2个好处: 1. 减少代码目录的深度 2. 可以通过前缀快速找到映射目录,提高自动加载的效率

本文分享自微信公众号 - PHP技术大全(phpgod)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php跨域的几种方式

    利用html里面script标签可以加载其他域下的js这一特性,使用script src的形式来获取其他域下的数据,但是,因为是通过标签引入的,所以,会将请求到...

    叫我可儿呀
  • 织梦栏目无法删除的解决方法

    乄浪漫经典
  • php如何做接口

    一个类可以一次性实现多个接口。语法用implements实现,然后在把接口的功能实现;

    叫我可儿呀
  • 织梦后台登录之后出现白板问题

    目录下面:/include/userlogin.class.php 打开文件并搜索@session_register

    乄浪漫经典
  • 「网站优化」网站优化中你必须学会,学会放弃——放弃是一种智慧

    网站优化在优化了很长时间后,你却发现自己进入了瓶颈期;你有没有考虑过为什么自己会进入瓶颈期。

    大脸猫
  • OpenResty: PHP增加数据库插件

    首先修改下php.ini 文件  告诉php当前的扩展库路径   扩展库--就是扩展的其它功能的库

    杨奉武
  • Xcode URLSession -- [61: Connection refused]

    nw_socket_handle_socket_event C1:2 Socket SO_ERROR 61: Connection refused

    HaythamXu
  • 如何判断微信小程序的开发成本

      智能化的时代中,微信占据越来越多的流量,随着微信小程序的改变,越来越多的人选择开发微信小程序。但是屠呦呦很多人对小程序的开发感到疑惑,从前端来看,微信小程序...

    金优外卖
  • RESTful 架构基础

    译自 | dzone.com/refcardz/rest-foundations-restful

    用户1516716
  • PHP函数之日期时间函数date()详解

    format 必需。规定时间戳的格式。 timestamp 可选。规定时间戳。默认是当前的日期和时间。

    乄浪漫经典

扫码关注云+社区

领取腾讯云代金券