psr規範php
引言: PSR 是 PHP Standard Recommendations 的簡寫,由 PHP FIG 組織制定的 PHP 規範,是 PHP 開發的實踐標準。這些規範的目的是:經過框架做者或者框架的表明之間討論,以最低程度的限制,制定一個協做標準,各個框架遵循統一的編碼規範,避免各家自行發展的風格阻礙了 PHP 的發展,解決這個程序設計師由來已久的困擾。截止到筆者文章psr在用的共11套規範,下面介紹了其中四個和已經棄用的psr0規範。緩存
PSR-0 (Autoloading Standard) 自動加載標準 (2014年10月21起被官方棄用 由psr4替代) PSR-1 (Basic Coding Standard) 基礎編碼標準 PSR-2 (Coding Style Guide) 編碼風格嚮導 PSR-3 (Logger Interface) 日誌接口 PSR-4 (Improved Autoloading) 自動加載的在用版本。 #注:另有psr6(緩存接口規範)psr7(HTTP消息接口規範)psr十一、psr1三、psr1五、psr1六、psr17本文不作介紹
附上官網地址psr框架
自動加載標準ide
注:由於已經廢棄,這裏再也不多作介紹函數
這裏先介紹psr4,好和上面的psr0做對比,由於他是升級版的PSR-0自動加載規範
PSR4是關於由文件路徑自動載入對應的類的相關規範,本規範是可互操做的。能夠做爲任一自動(包括PSR-0)載入規範的補充,此外,PSR4還包括自動載入的類對應的文件存放路徑規範。ui
此處的「類」泛指全部的class類、接口、traits可複用代碼塊以及其餘相似結構。
一個完整的類名須要具備如下結構
<命名空間> ( <子命名空間> )* <類名>
編碼
當根據完整的類名載入相應的文件spa
例如:操作系統
#完整的類名爲 \a\b\c\Log #命名空間前綴前綴爲: a\b #前綴對應的基礎目錄爲: ./vendor #文件實際目錄爲: ./vendor/c/Log.php #注:即把去掉最前面的命名空間分隔符後的a\b\c\Log中的命名空間前綴替換成基礎目錄,而後把命名空間分隔符替換成目錄分隔符,並把文件名補上後綴 .php 。
PSR-4和PSR-0最大的區別是對下劃線(underscore)的定義不一樣。PSR-4中,在類名中使用下劃線沒有任何特殊含義。而PSR-0則規定類名中的下劃線_會被轉化成目錄分隔符。debug
一個源文件建議只用來作聲明(類(class),函數(function),常量(constant)等)或者只用來作一些引發從屬效應的操做(例如:輸出信息,包含文件,修改.ini配置等),但不能同時使用二者。
注:「從屬效應」(side effects)一詞的意思是,僅僅經過包含文件,不直接聲明類、函數和常量等,而執行的邏輯操做。 「從屬效應」包含卻不只限於:生成輸出、直接的 require 或 include、鏈接外部服務、修改 ini 配置、拋出錯誤或異常、修改全局或靜態變量、讀或寫文件等。 這個不少人都不遵照,可是基本上全部框架裏都不會把修改.ini配置和聲明類或函數放到一塊兒,好比框架index.php入口文件只定義宏常量和修改.ini等
方法名(method name) 必須使用駝峯式(cameCase)寫法。
<?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleMethod($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } }
一般還有如下幾點須要注意
對於php文件:
關鍵字和 True/False/Null
命名空間
例如:
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... additional PHP code ...
控制結構
if ,else ,elseif ,while ,do while ,switch case ,for, foreach,try catch等。這一類的寫法規範也是常常容易出現問題的,也要規範一下。在關鍵字和後面的判斷條件中間應該加空格,在判斷條件和左大括號之間也要加空格。
本規範的主要目的,是爲了讓類庫以簡單通用的方式接收一個Psr\Log\LoggerInterface對象,來記錄日誌信息。框架以及CMS內容管理系統若有須要,能夠擴展接口以用於它們本身的
目的,但須遵循本規範,才能在使用第三方的類庫文件時,保證日誌接口仍能正常對接。
LoggerInterface 接口對外定義了八個方法,分別用來記錄RFC 5424中定義的八個級別:debug、info、notice、warning、error、critical、alert,emergency。
第九個方法-log,其第一個參數爲日誌的等級,可以使用一個預約義好的等級常量做爲參數來調用此方法,必須與直接調用以上八個方法具備相同的效果。若是傳入的等級常量參數沒有預先定義,就必須拋出Psr\Log\InvalidArgumentException類型的異常,在不肯定的狀況下,使用者不應使用未支持的等級常量來調用此方法。若是有用過monolog就應該對這裏有較深的理解。
例如,日誌等級能夠定義以下:
<?php namespace Psr\Log; /** * Describes log levels */ class LogLevel { const EMERGENCY = 'emergency'; const ALERT = 'alert'; const CRITICAL = 'critical'; const ERROR = 'error'; const WARNING = 'warning'; const NOTICE = 'notice'; const INFO = 'info'; const DEBUG = 'debug'; }
日誌這裏想必你們接觸的也很少,若是想了解能夠看一看monolog的源碼。 本文到此就結束,但願你們get到了想要的知識。