第11篇 PSR-0 規範

Mandatoryphp

  • 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 a DIRECTORY_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.html

這是PHP的第一個規範標準,e文如上,若是e文好的,能夠看原創,很差的就聽我嘮叨嘮叨,不對之處,請批評指出,謝謝!主要是制定了一些自動加載標準(Autoloading Standard),很短。這個標準在2014年已通過時,由新的 PSR-4標準替代。可是咱們也能夠看看嘛,這不影響咱們的學習。apache

PSR-0強制性要求如下幾點:windows

  1. 一個徹底合格的namespace和class必須符合這樣的結構:「\< Vendor Name>(< Namespace>)*< Class Name>」
  2. 每一個namespace必須有一個頂層的namespace("Vendor Name"提供者名字)
  3. 每一個namespace能夠有多個子namespace
  4. 當從文件系統中加載時,每一個namespace的分隔符(/)要轉換成 DIRECTORY_SEPARATOR(操做系統路徑分隔符)
  5. 在類名中,每一個下劃線(_)符號要轉換成DIRECTORY_SEPARATOR(操做系統路徑分隔符)。在namespace中,下劃線(_)符號是沒有(特殊)意義的。
  6. 當從文件系統中載入時,合格的namespace和class必定是以 .php 結尾的
  7. verdor name,namespaces,class名能夠由大小寫字母組合而成(大小寫敏感的)

這裏主要講的是namespace和autoloading。less

第1條

好比個人文件 /Doctrine/Common/IsolatedClassLoader.php 這樣子的一個類文件,那麼你的namespace命名就必須聲明稱這樣:ide

聲明:namespace  \Doctrine\Common\
調用:\Doctrine\Common\IsolatedClassLoader

其中,Doctrine 表示一個模塊目錄 Vendor name, common就是namesapce, IsolatedClassLoader是class name。這樣一看就知道這個文件的目錄層次,一目瞭然。學習

再好比:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:this

聲明: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子命名空間。spa

 

第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上就悲劇了,提示找不到文件。因此,大小寫過重要了。

相關文章
相關標籤/搜索