在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org。
PRS-0规范是他们出的第1套规范,主要是制定了一些自动加载标准(Autoloading Standard),如果你英文比较好,可以直接看官网的这个:PSR-0,很短。但是如果,你英语烂成狗,那么就继续往下看我的瞎比比讲解吧!
我们打开PSR-0的主页时,发现多了一个警告:
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended as an alternative.
英语狗不好的,来,听我翻译:
不推荐使用 - 在2014年10月21日PSR-0已被标记为过时。PSR-4现在推荐作为替代。
那么也就是说PSR-0已!经!过!时!了!,别哭,PHP代码狗。虽说已经过时,但是我们也可以看看嘛,这不影响我们的学习,好了。废话不说了,开始吧:
PSR-0强制性要求几点:
- 一个完全合格的namespace和class必须符合这样的结构:“\()*”
- 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
- 每个namespace可以有多个子namespace
- 当从文件系统中加载时,每个namespace的分隔符(/)要转换成 DIRECTORY\_SEPARATOR(操作系统路径分隔符)
- 在类名中,每个下划线(\_)符号要转换成DIRECTORY\_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(\_)符号是没有(特殊)意义的。
- 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
- verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
是不是有点看不懂啊。什么namespace啊,什么autoloading啊。所以,如果你对命名空间还不是特别懂的话,可以google下namespace 和 自动加载相关的php知识。或者看下一篇,我专门来讲讲他们:namespace 和 autoloading
好,我们接着一条条举例来分析下:
第1条
比如我的文件 /Doctrine/Common/IsolatedClassLoader.php 这样子的一个类文件,那么你的namespace命名就必须声明称这样:
再比如:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:
1 2 | `namespace` `\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php` `namespace` `\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php` |
第4条
看这个例子,我们需要new 一个这样的类
1 | `new` `\Symfony\Core\Request` |
第5条
第5条是说namespace命名中的这个 \_ 符号 没有任何用处,就是用来表示目录分隔符的,但是注意在PRS-4中已经取消了这个\_ ,那么我们还是看一下,这个过时的规定是怎么样的:
1 2 3 | `\``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` |
第6条
第6条不用多说。既然你用php,文件名当然是得用.php 后缀结尾。这个规定的原因,我大致猜一下,估计是有人用 .php3 后缀的。好吧。这个是个神话了。因为在apache的配置文件中是允许的:
1 2 3 | ` ` ``DirectoryIndex index.php index.php3 index.html index.htm` ``/IfModule``>`` |
第7条
文件大小写的问题,这个其实是很重要的。因为Linux系统下是区分文件名和目录名大小写的,而在Windows下是不区分的。所以就会经常出现问题,比如:
1 | `namespace` `\Doctrine\Common\IsolatedClassLoader` |
评论1
暂时没有评论