#PHP PSR代碼標準
PSR-0 自動加載規范
==========
下面描述了關于自動加載器特性強制性要求:
強制性
---------
* 一個完全標準的命名空間必須要有以下的格式結構`\<Vendor Name>\(<Namespace>\)*<Class Name>`
* 命名空間必須有一個頂級的組織名稱 ("Vendor Name").
* 命名空間中可以根據情況使用任意數量的子空間
* 從文件系統中加載源文件的時,命名空間中的分隔符將被映射為 `DIRECTORY_SEPARATOR`
* 命名空間中的類名中的`_`沒有特殊含義,也將被作為`DIRECTORY_SEPARATOR`對待.
* 標準的命名空間和類從文件系統加載源文件時只需要加上`.php`后綴即可
* 組織名,空間名,類名都可以隨意使用大小寫英文字符的組合
示例
--------
* `\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`
命名空間和類名中的下劃線
-----------------------------------------
* `\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`
以上是我們為輕松實現自動加載特性設定的最低標準。你可以利用下面這個可以自動加載 PHP 5.3 類的SplClassLoader來測試你的代碼是否符合以上這些標準。
實例
----------------------
下面是一個函數實例簡單展示如何使用上面建議的標準進行自動加載
```
<?php
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
```
SplClassLoader實現
-----------------------------
下面的gist是一個可以按照上面建議的自動加載特性來加載類的SplClassLoader實例。這也是我們當前在PHP5.3中依據以上標準加載類時推薦的方。
* [http://gist.github.com/221634](http://gist.github.com/221634)
----
PSR-1 基本代碼規范
=====================
本節標準包含了成為標準代碼所需要的基本元素,以確保開源出來的PHP代碼之間有較高度的技術互用性。
在 [RFC 2119][]中的特性關鍵詞"必須"(MUST),“不可”(MUST NOT),“必要”(REQUIRED),“將會”(SHALL),“不會”(SHALL NOT),“應當”(SHOULD),“不應”(SHOULD NOT),“推薦”(RECOMMENDED),“可以”(MAY)和“可選”(OPTIONAL)在這文檔中將被用來描述。
[RFC 2119]: http://www.ietf.org/rfc/rfc2119.txt
[PSR-0]: https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-0.md
1. 大綱
-----------
- 源文件`必須`只使用 `<?php` 和 `<?=` 標簽。
- 源文件中`必須`只使用不帶BOM的UTF-8作為PHP代碼。
- 源文件`應當`只聲明符號(類,函數,常量等...)或者引起副作用(例如:生成輸出,修改.ini配置等),但`不應`同時做這兩件事。
- 命名空間和類`必須`遵守 [PSR-0][]。
- 類名`必須`使用駱駝式`StudlyCaps`寫法 (譯者注:駝峰式的一種變種,后文將直接用`StudlyCaps`表示)。
- 類中的常量`必須`使用全大寫和下劃線分隔符。
- 方法名`必須`使用駝峰式`cameCase`寫法(譯者注:后文將直接用`camelCase`表示)。
2. 文件
--------
### 2.1. PHP標簽
PHP代碼`必須`只使用長標簽`<?php ?>`或者短輸出式`<?= ?>`標簽;它`不可`使用其他的標簽變種。
### 2.2. 字符編碼
PHP代碼`必須`只使用不帶BOM的UTF-8。
### 2.3. 副作用
一個文件`應當`聲明新符號 (類名,函數名,常量等)并且不產生副作用,或者`應當`執行有副作用的邏輯,但不能同時做這兩件事。
短語"副作用"意思是不直接執行邏輯的類,函數,常量等 *僅包括文件*
“副作用”包含但不局限于:生成輸出,顯式地使用`require`或`include`,連接外部服務,修改ini配置,觸發錯誤或異常,修改全局或者靜態變量,讀取或修改文件等等
下面是一個既包含聲明又有副作用的示例文件;即應避免的例子:
```
<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
// side effect: loads a file
include "file.php";
// side effect: generates output
echo "<html>\n";
// declaration
function foo()
{
// function body
}
```
下面是一個僅包含聲明的示例文件;即需要提倡的例子:
```
<?php
// declaration
function foo()
{
// function body
}
// conditional declaration is *not* a side effect
if (! function_exists('bar')) {
function bar()
{
// function body
}
}
```
3. 命名空間和類名
----------------------------
命名空間和類名必須遵守 [PSR-0][].
這意味著每個類必須單獨一個源文件,并且至少有一級命名空間:頂級的組織名。
類名必須使用駱駝式`StudlyCaps`寫法。
PHP5.3之后的代碼`必須`使用正式的命名空間
例子:
```
<?php
// PHP 5.3 and later:
namespace Vendor\Model;
class Foo
{
}
```
PHP5.2.x之前的代碼應當用偽命名空間`Vendor_`作為類名的前綴
```
<?php
// PHP 5.2.x and earlier:
class Vendor_Model_Foo
{
}
```
4. 類常量,屬性和方法
-------------------------------------------
術語“類”指所有的類,接口和特性(traits)
### 4.1. 常量
類常量`必須`使用全大寫,并使用分隔符作為下劃線。
例子:
```
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
```
### 4.2. 屬性
本手冊有意避免推薦使用`$StulyCaps`,`$camelCase`或者`unser_score`作為屬性名字
不管名稱如何約定,它`應當`在一個合理范圍內保持一致。這個范圍可能是組織層,包層,類層,方法層。
### 4.3. 方法
方法名必須用`camelCase()`寫法。
------
PSR-2 代碼樣式規范
==================
本手冊是 [PSR-1][]基礎代碼規范的繼承和擴展
本指南的意圖是為了減少不同開發者在瀏覽代碼時減少認知的差異。 為此列舉一組如何格式化PHP代碼的共用規則。
各個成員項目的共性組成了本文的樣式規則。當不同的開發者在不同的項目中合作時,將會在這些不同的項目中使用一個共同的標準。 因此,本指南的好處不在于規則本身,而在于共用這些規則。
在 [RFC 2119][]中的特性關鍵詞"必須"(MUST),“不可”(MUST NOT),“必要”(REQUIRED),“將會”(SHALL),“不會”(SHALL NOT),“應當”(SHOULD),“不應”(SHOULD NOT),“推薦”(RECOMMENDED),“可以”(MAY)和“可選”(OPTIONAL)在這文檔中將被用來描述。
[RFC 2119]: http://www.ietf.org/rfc/rfc2119.txt
[PSR-0]: https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-0.md
[PSR-1]: https://github.com/hfcorriez/fig-standards/blob/zh_CN/接受/PSR-1-basic-coding-standard.md
1. 大綱
-----------
- 代碼必須遵守 [PSR-1][]。
- 代碼`必須`使用4個空格的縮進,而不是制表符。
- 一行代碼長度`不應`硬性限制;軟限制`必須`為120個字符;也`應當`是80個字符或者更少。
- 在`namespace`聲明下面`必須`有一個空行,并且`use`聲明代碼塊下面也`必須`有一個空行。
- 類的左花括號`必須`放到下一行,右花括號`必須`放在類主體的下一行。
- 方法的左花括號`必須`放在下一行,右花括號`必須`放在方法主體下面。
- 所有的屬性和方法`必須`有可見性(譯者注:Public, Protect, Private)聲明;`abstract`和`final`聲明`必須`在可見性之前;`static`聲明`必須`在可見性之后。
- 控制結構的關鍵詞`必須`在后面有一個空格; 方法和函數`不可`有。
- 控制結構的左花括號`必須`放在同一行,右花括號`必須`放在控制主體的下一行。
- 控制結構的左括號后面`不可`有空格,右括號之前`不可`有空格。
### 1.1. 示例
本示例包含上面的一些規則簡單展示:
```
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public function sampleFunction($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
}
}
```
2. 概括
----------
### 2.1 基礎代碼規范
代碼`必須`遵守 [PSR-1][] 的所有規則。
### 2.2 文件
所有的PHP文件`必須`使用Unix LF(換行)作為行結束符。
所有PHP文件`必須`以一個空行結束。
純PHP代碼的文件關閉標簽`?>``必須`省略
### 2.3. 行
行長度`不可`有硬限制。
行長度的軟限制`必須`是120個字符;對于軟限制,自動樣式檢查器`必須`警告但`不可`報錯。
行實際長度`不應`超過80個字符;較長的行`應當`被拆分成多個不超過80個字符的后續行。
在非空行后面`不可`有空格。
空行`可以`用來改善可讀性和區分相關的代碼塊。
一行`不應`多于一個語句。
### 2.4. 縮進
代碼`必須`使用4個空格的縮進,并且`不可`使用制表符作為縮進。
> 注意:只用空格,不和制表符混合使用,將會對避免代碼差異,補丁,歷史和注解中的一些問題有幫助。使用空格還可以使調整細微的縮進來改進行間對齊變得非常簡單。
### 2.5. 關鍵詞和 True/False/Null
PHP [keywords][] `必須`使用小寫。
PHP常量`true`, `false`和`null``必須`使用小寫。
[keywords]: http://php.net/manual/en/reserved.keywords.php
3. Namespace和Use聲明
---------------------------------
如果存在,`namespace`聲明之后`必須`有一個空行。
如果存在,所有的`use`聲明`必須`放在`namespace`聲明的下面。
一個`use`關鍵字`必須`只用于一個聲明。
在`use`聲明代碼塊后面`必須`有一個空行。
示例:
```
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// ... additional PHP code ...
```
4. 類,屬性和方法
-----------------------------------
術語“類”指所有的類,接口和特性(traits)。
### 4.1. 擴展和繼承
一個類的`extends`和`implements`關鍵詞`必須`和類名在同一行。
類的左花括號`必須`放在下面自成一行;右花括號必須放在類主體的后面自成一行。
```
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}
```
`implements`一個列表`可以`被拆分為多個有一次縮進的后續行。如果這么做,列表的第一項`必須`要放在下一行,并且每行`必須`只有一個接口。
```
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// constants, properties, methods
}
```
### 4.2. 屬性
所有的屬性`必須`聲明可見性。
`var`關鍵詞`不可`用來聲明屬性。
一個語句`不可`聲明多個屬性。
屬性名稱`不應`使用單個下劃線作為前綴來表明保護或私有的可見性。
一個屬性聲明看起來應該下面這樣的。
```
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
```
### 4.3. 方法
所有的方法`必須`聲明可見性。
方法名`不應`只使用單個下劃線來表明是保護或私有的可見性。
方法名在聲明之后`不可`跟隨一個空格。左花括號`必須`放在下面自成一行,并且右花括號`必須`放在方法主體的下面自成一行。左括號后面`不可`有空格,右括號前面`不可`有空格。
一個方法定義看來應該像下面這樣。 注意括號,逗號,空格和花括號:
```
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
```
### 4.4. 方法參數
在參數列表中,逗號之前`不可`有空格,逗號之后`必須`要有一個空格。
方法中有默認值的參數必須放在參數列表的最后面。
```
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// method body
}
}
```
參數列表`可以`被分為多個有一次縮進的多個后續行。如果這么做,列表的第一項`必須`放在下一行,并且每行`必須`只放一個參數。
當參數列表被分為多行,右括號和左花括號`必須`夾帶一個空格放在一起自成一行。
```
<?php
namespace Vendor\Package;
class ClassName
{
public function aVeryLongMethodName(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
) {
// method body
}
}
```
### 4.5. `abstract`,`final`和 `static`
如果存在,`abstract`和`final`聲明必須放在可見性聲明前面。
如果存在,`static`聲明`必須`跟著可見性聲明。
```
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// method body
}
}
```
### 4.6. 調用方法和函數
要調用一個方法或函數,在方法或者函數名和左括號之間`不可`有空格,左括號之后`不可`有空格,右括號之前`不可`有空格。函數列表中,逗號之前`不可`有空格,逗號之后`必須`有一個空格。
```
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
```
參數列表`可以`被拆分成多個有一個縮進的后續行。如果這么做,列表中的第一項必須放在下一行,并且每一行`必須`只有一個參數。
```
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
```
5. 控制結構
---------------------
對于控制結構的樣式規則概括如下:
- 控制結構關鍵詞之后`必須`有一個空格
- 左括號之后`不可`有空格
- 右括號之前`不可`有空格
- 在右括號和左花括號之間`必須`有一個空格
- 代碼主體`必須`有一次縮進
- 右花括號`必須`主體的下一行
每個結構的主體`必須`被括在花括號里。這結構看上去更標準化,并且當加新行的時候可以減少引入錯誤的可能性。
### 5.1. `if`,`elseif`,`else`
一個`if`結構看起來應該像下面這樣。注意括號,空格,花括號的位置;并且`else`和`elseif`和前一個主體的右花括號在同一行。
```
<?php
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
```
關鍵詞`elseif``應該`替代`else if`使用以保持所有的控制關鍵詞像一個單詞。
### 5.2. `switch`,`case`
一個`switch`結構看起來應該像下面這樣。注意括號,空格和花括號。`case`語句必須從`switch`處縮進,并且`break`關鍵字(或其他中止關鍵字)`必須`和`case`主體縮進在同級。如果一個非空的`case`主體往下落空則`必須`有一個類似`// no break`的注釋。
```
<?php
switch ($expr) {
case 0:
echo 'First case, with a break';
break;
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
```
### 5.3. `while`,`do while`
一個`while`語句看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
while ($expr) {
// structure body
}
```
同樣的,一個`do while`語句看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
do {
// structure body;
} while ($expr);
```
### 5.4. `for`
一個`for`語句看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
for ($i = 0; $i < 10; $i++) {
// for body
}
```
### 5.5. `foreach`
一個`foreach`語句看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
foreach ($iterable as $key => $value) {
// foreach body
}
```
### 5.6. `try`, `catch`
一個`try catch`語句看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
try {
// try body
} catch (FirstExceptionType $e) {
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
```
6. 閉包
-----------
閉包在聲明時`function`關鍵詞之后`必須`有一個空格,并且`use`之前也需要一個空格。
左花括號`必須`在同一行,右花括號`必須`在主體的下一行。
參數列表和變量列表的左括號之后`不可`有空格,其右括號之前也`不可`有空格。
在參數列表和變量列表中,逗號之前`不可`有空格,逗號之后`必須`有空格。
閉包帶默認值的參數`必須`放在參數列表后面。
一個閉包聲明看起來應該像下面這樣。注意括號,空格和花括號的位置。
```
<?php
$closureWithArgs = function ($arg1, $arg2) {
// body
};
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
// body
};
```
參數和變量列表`可以`被分成多個帶一次縮進的后續行。如果這么做,列表的第一項`必須`放在下一行,并且一行`必須`只放一個參數或變量。
當最終列表(不管是參數還是變量)被分成多行,右括號和左花括號`必須`夾帶一個空格放在一起自成一行。
下面是一個參數和變量列表被分割成多行的示例。
```
<?php
$longArgs_noVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// body
};
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// body
};
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// body
};
```
注意如果在函數或者方法中把閉包作為一個參數調用,如上格式規則同樣適用。
```
<?php
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// body
},
$arg3
);
```
7. 結論
--------------
在該指南中有很多風格的元素和做法有意被忽略掉。這些包括但不局限于:
- 全局變量和全局常量的聲明
- 方法聲明
- 操作符和賦值
- 行間對齊
- 注釋和文檔塊
- 類名給你前綴和后綴
- 最佳實踐
以后的建議`可以`修改和擴展該指南以滿足這些或其他風格的元素和實踐。
---
PSR-3 日志接口
================
本文檔用來描述日志類庫的通用接口。
主要目標是讓類庫獲得一個`Psr\Log\LoggerInterface`對象并且使用一個簡單通用的方式來寫日志。有自定義需求的框架和CMS`可以`根據情況擴展這個接口,但`應當`保持和該文檔的兼容性,這將確保使用第三方庫和應用能統一的寫應用日志。
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in [RFC 2119][].
關鍵詞`實現者`在這個文檔被解釋為:在日志相關的庫和框架實現`LoggerInterface`接口的人。用這些實現的人都被稱作`用戶`。
[RFC 2119]: http://tools.ietf.org/html/rfc2119
1. 規范
-----------------
### 1.1 基礎
- `LoggerInterface`暴露八個接口用來記錄八個等級(debug, info, notice, warning, error, critical, alert, emergency)的日志。
- 第九個方法是`log`,接受日志等級作為第一個參數。用一個日志等級常量來調用這個方法的結果`必須`和調用具體等級方法的一致。如果具體的實現不知道傳入的不按規范的等級來調用這個方法`必須`拋出一個`Psr\Log\InvalidArgumentException`。用戶`不應`自定義一個當前不支持的未知等級。
[RFC 5424]: http://tools.ietf.org/html/rfc5424
### 1.2 消息
- 每個方法都接受字符串,或者有`__toString`方法的對象作為消息。實現者可以對傳入的對象有特殊的處理。如果不是,實現者`必須`將它轉換成字符串。
- 消息`可以`包含`可以`被上下文數組的數值替換的占位符。
占位符名字`必須`和上下文數組鍵名對應。
占位符名字`必須`使用使用一對花括號為分隔。在占位符和分隔符之間`不能`有任何空格。
占位符名字`應該`由`A-Z`,`a-z`,`0-9`,下劃線`_`和句號`.`。其它的字符作為以后占位符規范的保留。
實現者可以使用占位符來實現不同的轉義和翻譯日志成文。用戶在不知道上下文數據是什么的時候`不應`提前轉義占位符。
下面提供一個占位符替換的例子,僅作為參考:
```
/**
* Interpolates context values into the message placeholders.
*/
function interpolate($message, array $context = array())
{
// build a replacement array with braces around the context keys
$replace = array();
foreach ($context as $key => $val) {
$replace['{' . $key . '}'] = $val;
}
// interpolate replacement values into the message and return
return strtr($message, $replace);
}
// a message with brace-delimited placeholder names
$message = "User {username} created";
// a context array of placeholder names => replacement values
$context = array('username' => 'bolivar');
// echoes "Username bolivar created"
echo interpolate($message, $context);
```
### 1.3 上下文
- 每個方法接受一個數組作為上下文數據,用來存儲不適合在字符串中填充的信息。數組可以包括任何東西。實現者`必須`確保他們對上下文數據足夠的掌控。在上下文中一個給定值`不可`拋出一個異常,也`不可`產生任何PHP錯誤,警告或者提醒。
- 如果在上下文中傳入了一個`異常`對象,它必須以`exception`作為鍵名。記錄異常軌跡是通用的模式,如果日志底層支持這樣也是可以被允許的。實現者在使用它之前`必須`驗證`exception`的鍵值是不是一個`異常`對象,因為它`可以`允許是任何東西。
### 1.4 助手類和接口
- `Psr\Log\AbstractLogger`類讓你非常簡單的實現和擴展`LoggerInterface`接口以實現通用的`log`方法。其他八個方法將會把消息和上下文轉發給它。
- 類似的,使用`Psr\Log\LoggerTrait`只需要你實現通用的`log`方法。記住traits不能實現接口前,你依然需要`implement LoggerInterface`。
- `Psr\Log\NullLogger`是和接口一個提供的。它`可以`為使用接口的用戶提供一個后備的“黑洞”。如果上下文數據非常重要,這不失為一個記錄日志更好的辦法。
- `Psr\Log\LoggerAwareInterface`只有一個`setLogger(LoggerInterface $logger)`方法可以用來隨意設置一個日志記錄器。
- `Psr\Log\LoggerAwareTrait`trait可以更簡單的實現等價于接口。通過它可以訪問到`$this->logger`。
- `Psr\Log\LogLevel`類擁有八個等級的常量。
2. 包
----------
作為[psr/log](https://packagist.org/packages/psr/log) 的一部分,提供接口和相關異常類的一些描述以及一些測試單元用來驗證你的實現。
3. `Psr\Log\LoggerInterface`
----------------------------
```
<?php
namespace Psr\Log;
/**
* Describes a logger instance
*
* The message MUST be a string or object implementing __toString().
*
* The message MAY contain placeholders in the form: {foo} where foo
* will be replaced by the context data in key "foo".
*
* The context array can contain arbitrary data, the only assumption that
* can be made by implementors is that if an Exception instance is given
* to produce a stack trace, it MUST be in a key named "exception".
*
* See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
* for the full interface specification.
*/
interface LoggerInterface
{
/**
* System is unusable.
*
* @param string $message
* @param array $context
* @return null
*/
public function emergency($message, array $context = array());
/**
* Action must be taken immediately.
*
* Example: Entire website down, database unavailable, etc. This should
* trigger the SMS alerts and wake you up.
*
* @param string $message
* @param array $context
* @return null
*/
public function alert($message, array $context = array());
/**
* Critical conditions.
*
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
* @param array $context
* @return null
*/
public function critical($message, array $context = array());
/**
* Runtime errors that do not require immediate action but should typically
* be logged and monitored.
*
* @param string $message
* @param array $context
* @return null
*/
public function error($message, array $context = array());
/**
* Exceptional occurrences that are not errors.
*
* Example: Use of deprecated APIs, poor use of an API, undesirable things
* that are not necessarily wrong.
*
* @param string $message
* @param array $context
* @return null
*/
public function warning($message, array $context = array());
/**
* Normal but significant events.
*
* @param string $message
* @param array $context
* @return null
*/
public function notice($message, array $context = array());
/**
* Interesting events.
*
* Example: User logs in, SQL logs.
*
* @param string $message
* @param array $context
* @return null
*/
public function info($message, array $context = array());
/**
* Detailed debug information.
*
* @param string $message
* @param array $context
* @return null
*/
public function debug($message, array $context = array());
/**
* Logs with an arbitrary level.
*
* @param mixed $level
* @param string $message
* @param array $context
* @return null
*/
public function log($level, $message, array $context = array());
}
```
4. `Psr\Log\LoggerAwareInterface`
---------------------------------
```
<?php
namespace Psr\Log;
/**
* Describes a logger-aware instance
*/
interface LoggerAwareInterface
{
/**
* Sets a logger instance on the object
*
* @param LoggerInterface $logger
* @return null
*/
public function setLogger(LoggerInterface $logger);
}
```
5. `Psr\Log\LogLevel`
---------------------
```
<?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';
}
```