[轉載]PHP中PSR-[0-4]規範

 

PHP是世界上最偉大的語言,這一點是毋庸置疑的吧。哈哈哈哈哈哈 。這個霸氣的開頭不錯!(^__^)php

可是正是由於偉大,因此用的人也就多了,人一多,再牛逼再偉大的東西,都會產生問題,逐漸就形成了不少的分歧。每一個人的習慣不同,因此在一些PHP語法上的一些表現也是千差萬別,好比這些問題:html

function 函數名是否駝峯命名
花括號{}是否換行寫
是該寫註釋呢仍是不寫
變量名是大寫仍是小寫
一個php文件中是一個類好仍是容許有多個git

等等一系列的問題,接踵而至,你說你的這種方式屌,我說你傻逼啊個人纔好。因此。各類爭執聲此起彼伏。程序員

特別是當你去接手上任留下的坑的時候,若是你有本身的規範或者你是處女座,你就會罵死那個狗日的一萬遍了,每改一次就會改一遍罵:「麻痹的寫的都是什麼狗shit爛代碼啊」。因此,在PHP程序員的心中一個共有的心願誕生了:「能不能他媽的你們都遵照同一規範啊」。github

好,既然你們都有共同的心聲,那麼這樣一個的公共的規範就出來了,他就是PSR-[0-4]規範,它出來後,你們都以爲挺不錯的啊,還蠻符合本身的書寫風格的,漸漸的你們都知道了它,也慢慢的接受了它,愈來愈多的人知道了它,一些大牛的項目都慢慢的遵照了這個規範,而後也一幫菜鳥一看大牛都在用這個規範,我爲啥不也嘗試着規範一下呢?sql

因此,漸漸的PSR-[0-4]規範成爲了PHP的一個王牌規範,你寫PHP就最好必須按照這裏面的規範寫,全球共享好代碼。apache

 

PHP-FIG

在說啥是PSR-[0-4]規範的以前,我以爲咱們有必要說下它的發明者和規範者:PHP-FIG,它的網站是:www.php-fig.org。就是這個聯盟組織發明和創造了PSR-[0-4]規範,膜拜吧,屌絲們!windows

FIG 是 Framework Interoperability Group(框架可互用性小組)的縮寫,由幾位開源框架的開發者成立於 2009 年,從那開始也選取了不少其餘成員進來,雖然不是 「官方」 組織,但也表明了社區中不小的一塊。組織的目的在於:以最低程度的限制,來統一各個項目的編碼規範,避免各家自行發展的風格阻礙了程序設計師開發的困擾,因而大夥發明和總結了PSR,PSR是Proposing a Standards Recommendation(提出標準建議)的縮寫,截止到目前爲止,總共有5套PSR規範,分別是:閉包

PSR-0 (Autoloading Standard) 自動加載標準
PSR-1 (Basic Coding Standard) 基礎編碼標準
PSR-2 (Coding Style Guide) 編碼風格嚮導
PSR-3 (Logger Interface) 日誌接口
PSR-4 (Improved Autoloading) 自動加載的加強版,能夠替換掉PSR-0了。框架

接下來的篇目,咱們會針對這5套,深刻了解下。仔細學習下受萬千PHPer熱捧的這5套規範到底有啥出衆之處。

 

PSR-0 規範

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強制性要求幾點:

  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啊。因此,若是你對命名空間還不是特別懂的話,能夠google下namespace 和 自動加載相關的php知識。或者看下一篇,我專門來說講他們:namespaceautoloading

好,咱們接着一條條舉例來分析下:

 

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

 

PSR-1 規範

仍是那句話,若是你英文比較好,能夠直接看官網的這個:PSR-1,也不長,基本能看懂。可是若是你英語爛成狗,那麼仍是請繼續往下看個人瞎比比!

  1. PHP源文件必須只使用 <?php<?= 這兩種標籤。
  2. 源文件中php代碼的編碼格式必須是不帶字節順序標記(BOM)的UTF-8。
  3. 一個源文件建議只用來作聲明(類(class),函數(function),常量(constant)等)或者只用來作一些引發反作用的操做(例如:輸出信息,修改.ini配置等),但不建議同時作這兩件事。
  4. 命名空間(namespace)和類(class) 必須遵照PSR-0標準。
  5. 類名(class name) 必須使用駱駝式(StudlyCaps)寫法 (注:駝峯式(cameCase)的一種變種,後文將直接用StudlyCaps表示)。
  6. 類(class)中的常量必須只由大寫字母和下劃線(_)組成。
  7. 方法名(method name) 必須使用駝峯式(cameCase)寫法。

好,就是上面的基本7大點,有些很簡單,就不過多說明,第3點須要仔細說下。

 

第1條

這個基本都是你們都懂得的,PHP代碼必須只使用長標籤(<?php ?>)或者短輸出式標籤(<?= ?>);而不要使用其餘標籤。

之因此說這個,是由於咱們在學習PHP的時候,通常的教材都告訴咱們說,php有4種標記風格:php的4種標記風格 因此,不少人就亂來了。瞎雞巴寫。特別是asp風格的兼職是折磨好麼!!!

 

第2條

這個很少說,保存的時候格式必須是無BOM的UTF-8格式,不然會出現不少沒法解釋的千奇百怪的問題。千萬別傻逼的用windows下的text文本編輯器保存文件啊

 

第3條

這個通俗的說呢。就是別把一些輸出和修改的操做(反作用) 和 類文件混合在一塊兒,專一一點,這個文件專門來聲明class, 那個文件專門來修改配置文件,別混在一塊兒寫:

因此,如下的這個文件是有問題的,最好不要這樣:

 
// 反作用:修改了ini配置
ini_set('error_reporting', E_ALL);

// 反作用:載入了文件 include "file.php";
// 反作用:產生了輸出 echo "<html>\n";

// 聲明 function function foo() {   // 函數體 }

 

你看上面看起來多亂啊。最好所有分開來寫:

 
namespace Lib;
className
{
  publicfunction __construct()
  {
    echo __NAMESPACE__ ."<br>";
  }
  
  
  publicstaticfunction test()   {     
echo __NAMESPACE__ .' static function test <br>';   } }

 

修改ini:

 
ini_set('error_reporting', E_ALL);

// require 文件:
require DIR .'/loading.php';
spl_autoload_register("\\AutoLoading\\loading::autoload");

 

你看是否是整齊好看多了。固然這個是很難約束的。本身仔細劃分。

 

第4條

第4條是約束namespace的,前面已經說過,很少說。值得說的是名字要是駝峯方式來

 

第5條

class name必需要用駝峯方式寫,駝峯又分小駝峯和大駝峯(小駝峯是第一個字母是小寫)這樣寫看着舒服也比較規範,不作要求,反正是駝峯就能夠了。我喜歡用小駝峯:

 
class getUserInfo
{
}

 

第6條

是規定類中的常量名(const)聲明必需要所有大小,若是有多個單詞,就用_分開:

 
class getUserInfo
{
    //所有大寫
    const NAME ='phper';

    //用_隔開
    const HOUSE_INFO ='已經大上海買房'
    publicfunction getUserName()
    {
    //
    }
}

 

 

第7條

method name必需要用駝峯方式寫,大小駝峯均可以,不作要求,我喜歡用小駝峯:

 
class getUserInfo
{
    publicfunction getUserName()
    {
        //
    }
}    

 

PRSR-2 規範

PSR-2 規範的官網連接在此:PSR-2 這一規範主要是約束代碼風格的,但是說是全部裏面最關鍵最重要的,也是須要好好規範和共同遵照的。

咱們一個個來看下,只能我大略的寫一些比較重要的,或者說平時用的最多的。

 

1. 源文件

  1. 文件末尾必須空一行。
  2. 必須使用Unix LF(換行)做爲行結束符。
  3. 純PHP代碼源文件的關閉標籤?>必須省略。

第3點實際上是蠻重要的,我以前還老寫閉合,如今不寫了。這能夠避免在 PHP 結束標記以後萬一意外加入了空格或者換行符,會致使 PHP 開始輸出這些空白,而腳本中此時並沒有輸出的意圖。

 

2. 縮進

必須使用4個空格來縮進,不能使用Tab鍵。固然你若是把Tab在編輯器裏手動設置爲4個空格也能夠。這樣的目的是由於:每一個人的機器上的Tab鍵都不同,有些是4個空格,有些是8個空格,在你的機器上看着很爽的代碼,在別人機器上了就各類噁心了。因此,統一搞成4個空格,無論在哪裏打開都是美觀的。

 

3. 行

一行推薦的是最多寫80個字符,多於這個字符就應該換行了,通常的編輯器是能夠設置的。

 

4. 關鍵字和 True/False/Null

php的關鍵字,必須小寫,boolean值:true,false,null 也必須小寫

下面是php的keyword,必須小寫。

'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

 

5. 命名空間(Namespace)和導入(Use)聲明

先簡單文字描述下:

  1. 命名空間(namespace)的聲明後面必須有一行空行。
  2. 全部的導入(use)聲明必須放在命名空間(namespace)聲明的下面。
  3. 一句聲明中,必須只有一個導入(use)關鍵字。
  4. 在導入(use)聲明代碼塊後面必須有一行空行。

用代碼來講明下:

 
<?php
namespaceLib\Databases;//下面必須空格一行

classMysql{

}

 

namespace下空一行,才能使用use,再空一行,才能聲明class

 
<?php
namespaceLib\Databases;// 下面必須空格一行

useFooInterface;//use 必須在namespace 後面聲明
useBarClassasBar;
useOtherVendor\OtherPackage\BazClass;// 下面必須空格一行

classMysql
{

}
 

6. 類(class),屬性(property)和方法(method)

1 . 繼承(extends) 和實現(implement) 必須和 class name 寫在一行,切花括號要換行寫。

 
<?php
namespaceLib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{ //換行寫{

}

 

2 . 屬性(property)必須聲明其可見性,究竟是 public 仍是protected仍是 private,不能省略,也不能使用var, var是php老版本中的什麼方式,等用於public.

 
<?php
namespaceLib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{
    public $foo =null;
    private $name ='yangyi';
    protected $age ='17';
}

 

3 . 方法(method) ,必須 聲明其可見性,究竟是 public 仍是protected仍是 private,不能省略。而且,花括號{必須換行寫。若是有多個參數,第一個參數後緊接, ,再加個空格,且函數name和( 之間必需要有個空格: function_name ($par, $par2, $pa3), 若是參數有默認值,也要用左右空格分開。

 
<?php
namespaceLib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 寫一行
{
    public getInfo ($name, $age, $gender =1)//函數名getInfo和(之間有個空格,參數之間也要有空格。默認參數也要左右都有空格
    {//必須換行寫{

    }
}

 

4 . 當用到抽象(abstract)和終結(final)來作類聲明時,它們必須放在可見性聲明 (public 仍是protected仍是 private)的前面。而當用到靜態(static)來作類聲明時,則必須放在可見性聲明的後面。

直接上代碼:

 
<?php
namespaceVendor\Package;

abstract classClassName
{
    protectedstatic $foo;//static放後面
    abstract protected function zim();//abstract放前面
    
    final publicstatic function bar()//final放前面,static放最後。
    {
        // 方法主體部分
    }
}    
 

7.控制結構

控制接口,就是if else while switch等。這一類的寫法規範也是常常容易出現問題的,也要規範一下。

1 . if,elseif,else寫法,直接上規範代碼吧:

 
<?php

if ($expr1) {//左右空格
    // if body
} elseif ($expr2){//elesif 連着寫
    // elseif body
}else{
    // else body;
}

 

2 . switchcase 注意左右空格和換行,仍是直接上規範代碼:

 
<?php

switch ($expr) {//左右空格
    case0:
        echo 'First case, with a break';//對其
        break;//換行寫break ,也對其。
    case1:
        echo 'Second case, which falls through';
        // no break
    case2:
    case3:
    case4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}                        

 

3 . whiledo while 的寫法也是相似,要左右空格,上代碼:

 
<?php
while ($expr) {//左右空格
    // structure body
}

do {// structure body; //左右空格

} while ($expr);

 

4 . for的寫法

 
<?php
for($i =0; $i <10; $i++) {//注意幾個參數之間的空格
 // for body
}

 

5 . foreach的寫法

 
<?php
foreach ($iterable as $key => $value) {//仍是空格問題
// foreach body
}

 

6 . try catch的寫法

 
<?php
try{
// try body
} catch (FirstExceptionType $e) {//一樣也是注意空格。
// catch body
} catch(OtherExceptionType $e) {
// catch body
}

 

基本用到的就是這些了,其餘什麼閉包啥的用的很少就不過多的累述了。

 

PSR-3 規範

PSR-3規範主要是來規範日誌接口(Logger Interface)的,老實講,其實日常接觸的不是特別多,因此就不說了,能夠去看官網的PSR-3

 

PSR-4 規範

PSR-4規範是剛出沒多久的一條新的規範,它也是規範 自動加載(autoload)的,是對PSR-0的修改,屬於補充規範,

我簡單說下,主要是如下幾點:
1. 廢除了PSR-0中_就是目錄分割符的寫法,_下劃線在徹底限定類名中是沒有特殊含義了。
2. 類文件名要以 .php 結尾。
3. 類名必需要和對應的文件名要如出一轍,大小寫也要如出一轍。

原文地址:https://www.zybuluo.com/phper/note/65033

完整版可參考:https://github.com/zhaojunlike/php-psr-chinese

相關文章
相關標籤/搜索