PSR-0是什么?
作者:binPSR是由PHP Framework Interoperability Group(PHP通用性框架小组)发布的一系列标准/规范,目前包括了PSR-0~PSR-4共4个,而PSR-0就是其中的自动加载标准(其后的PSR-4称为改进的自动加载的标准,是PSR-0的补充。PSR-0使用更广泛)
psr-0实际上是在自动加载时对命名空间对进一步规范化,以便自动加载程序能正常运行
官方md : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
强制性
- 1、每个namespace必须有一个顶层的namespace(”Vendor Name”提供者名字)
- 2、一个完全合格的namespace和class必须符合这样的结构 \
* - 3、每个namespace可以有多个子namespace
- 4、当从文件系统中加载时,每个namespace的分隔符要转换成 DIRECTORY_SEPARATOR(操作系统路径分隔符)
- 5、在CLASS NAME(类名)中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR。在namespace中,下划线(_)符号是没有(特殊)意义的。
- 6、当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
- 7、verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
例子:
- 1、\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
- 2、\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
- 3、\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
- 4、\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
下面是一个按照如上标准进行自动加载的简单范例:
<?php function autoload($className) { //这里的$className一般是用namespace的方式来引用的,文章开头已有介绍 //去除$className左边的'\' 这是PHP5.3的一个bug,详见https://bugs.php.net/50731 $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; //找到最后一个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;