《現代 PHP》學習筆記(九):PSR-3 & PSR-4

前言

本文為《現代 PHP》一書的學習筆記。

環境

  • Windows 10
  • XAMPP 3.2.2

PSR-3

第三個 PHP-FIG 建議,並不是一個指南,而是一個介面,規定了可以被 PHP 紀錄者元件所實作的方法。

紀錄者是個物件,用來輸出不同重要等級的訊息,被紀錄的訊息是用來診斷、分析和檢查應用程式的流程、穩定性和效能。

PSR-3 介面遵循 RFC 5424 syslog 協定,規定了以下九個方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace Psr\Log;

interface LoggerInterface
{
public function emergency($message, array $context = array());
public function alert($message, array $context = array());
public function critical($message, array $context = array());
public function error($message, array $context = array());
public function warning($message, array $context = array());
public function notice($message, array $context = array());
public function info($message, array $context = array());
public function debug($message, array $context = array());
public function log($message, array $context = array());
}
  • 介面中方法的第一個參數 $message 必須是一個字串或擁有 __toString() 方法的物件。
  • 介面中方法的第二個參數 $context 不是必要的,提供了一個陣列的値,用來替換第一個參數 Token

假如今天需要一個 PSR-3 紀錄器,可以直接使用 Monolog 元件。

範例 3-1:使用 Monolog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

date_default_timezone_set('America/New_York');

// 準備紀錄器
$log = new Logger('myApp');
$log->pushHandler(new StreamHandler('logs/development.log', Logger::DEBUG));
$log->pushHandler(new StreamHandler('logs/production.log', Logger::WARNING));

// 使用紀錄器
$log->debug('This is a debug message');
$log->warning('This is a warning message');

PSR-4

第四個 PHP-FIG 建議,描述了一個標準化的自動載入策略,自動載入器是一個尋找並載入 PHP 類別、介面和特徵機制的策略。

在程式執行時期,自動載入器在有需要時把成員載入到 PHP 直譯器中,僅需要一個自動載入器,就可以定位所有支援 PSR-4 自動載入器標準的 PHP 元件和框架。

PSR-4 的精神在於對應名稱空間的字首到特定檔案系統目錄。

範例 3-2:PSR-4 自動載入器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spl_autoload_register(function ($class) {

// 指定專案的名稱空間字首
$prefix = 'Foo\\';

// 名稱空間字首的基底目錄
$base_dir = __DIR__ . '/src/';

// 確認此類別使用名稱空間字首
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// 若沒有,就移到下一個註冊的自動載入器
return;
}

// 取得相關類別名稱
$relative_class = substr($class, $len);

// 將名稱空間字首替換成基底目錄,
// 在相關類別名稱中將名稱空間分隔字元替換成目錄分隔字元,
// 最後加上 `.php` 副檔名
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

// 如果此檔存在,就將其匯入
if (file_exists($file)) {
require $file;
}
});

如果需要自動生成 PSR-4 自動載入器,直接使用 Composer 相依性管理器即可。

參考資料

  • Josh Lockhart(2015)。現代 PHP。台北市:碁峯資訊。