第11篇 PSR-0 规范
Mandatory
- A fully-qualified namespace and class must have the following structure
\<Vendor Name>\(<Namespace>\)*<Class Name>
- Each namespace must have a top-level namespace ("Vendor Name").
- Each namespace can have as many sub-namespaces as it wishes.
- Each namespace separator is converted to a
DIRECTORY_SEPARATOR
when loading from the file system. - Each
_
character in the CLASS NAME is converted to aDIRECTORY_SEPARATOR
. The_
character has no special meaning in the namespace. - The fully-qualified namespace and class is suffixed with
.php
when loading from the file system. - Alphabetic characters in vendor names, namespaces, and class names may be of any combination of lower case and upper case.
Examples
\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
Underscores in Namespaces and Class Names
\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
The standards we set here should be the lowest common denominator for painless autoloader interoperability. You can test that you are following these standards by utilizing this sample SplClassLoader implementation which is able to load PHP 5.3 classes.
这是PHP的第一个规范标准,e文如上,如果e文好的,可以看原创,不好的就听我唠叨唠叨,不对之处,请批评指出,谢谢!主要是制定了一些自动加载标准(Autoloading Standard),很短。这个标准在2014年已经过时,由新的 PSR-4标准替代。但是我们也可以看看嘛,这不影响我们的学习。
PSR-0强制性要求以下几点:
- 一个完全合格的namespace和class必须符合这样的结构:“\< Vendor Name>(< Namespace>)*< Class Name>”
- 每个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
- 每个namespace可以有多个子namespace
- 当从文件系统中加载时,每个namespace的分隔符(/)要转换成
DIRECTORY_SEPARATOR
(操作系统路径分隔符)- 在类名中,每个下划线(_)符号要转换成
DIRECTORY_SEPARATOR
(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的。- 当从文件系统中载入时,合格的namespace和class一定是以 .php 结尾的
- verdor name,namespaces,class名可以由大小写字母组合而成(大小写敏感的)
这里主要讲的是namespace和autoloading。
第1条
比如我的文件
/Doctrine/Common/IsolatedClassLoader.php
这样子的一个类文件,那么你的namespace命名就必须声明称这样:声明:namespace \Doctrine\Common\ 调用:\Doctrine\Common\IsolatedClassLoader
其中,Doctrine 表示一个模块目录 Vendor name, common就是namesapce, IsolatedClassLoader是class name。这样一看就知道这个文件的目录层次,一目了然。
再比如:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:
声明:namespace \Symfony\Core 调用:\Symfony\Core\Request
第2,3条
namespace \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php namespace \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
必须有一个顶级的zend的namespace, zend 下面可以有message子命名空间。
第4条
看这个例子,我们需要new 一个这样的类
new \Symfony\Core\Request
那么我再加载这个类文件时候,就要将分隔符\ 转换成 目录,也就是去 Vendor -> Symfony->Core->Request.php 一层层的目录找到这个文件。其实也就是和第1,2,3是反过来的对应关系。
第5条
第5条是说namespace命名中的这个 _符号 没有任何用处,就是用来表示目录分隔符的,但是注意在PRS-4中已经取消了这个_ ,那么我们还是看一下,这个过时的规定是怎么样的:
\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
以上2个namespace中的_ 其实是目录分隔符。并不是class name就是那样的。现在PSR-4出来后,确实觉得这样的规定有点不好。怪怪的。
第6条
第6条不用多说。既然你用php,文件名当然是得用.php 后缀结尾。这个规定的原因,我大致猜一下,估计是有人用 .php3 后缀的。好吧。这个是个神话了。因为在apache的配置文件中是允许的:
<IfModule dir_module> DirectoryIndex index.php index.php3 index.html index.htm </IfModule>
所以,老老实实的用.php作为后缀名吧。
第7条
文件大小写的问题,这个其实是很重要的。因为Linux系统下是区分文件名和目录名大小写的,而在Windows下是不区分的。所以就会经常出现问题,比如:
namespace \Doctrine\Common\IsolatedClassLoader
在Linux下就去严格按照大小写去找目录和文件了。但是如果你在windows下开发,全是小写也不会报错,你一发布到Linux上就悲剧了,提示找不到文件。所以,大小写太重要了。