什麼是 phpDocumentor?
phpDocumentor(舊稱 PHPDoc)是 PHP 專案的標準文件產生工具,從原始碼的 DocBlock 註釋自動產生 HTML/PDF/CHM 等格式的 API 文件。它強制開發者撰寫結構化註釋,提升程式碼可讀性與維護性。
安裝與執行
方式 1:Composer 全域安裝(推薦)
composer global require phpdocumentor/phpdocumentor
# 確保 ~/.composer/vendor/bin 在 PATH 中
phpdoc -d ./src -t ./docs/api
方式 2:專案本地安裝
composer require --dev phpdocumentor/phpdocumentor
./vendor/bin/phpdoc -d ./src -t ./docs/api
方式 3:Docker 執行(無污染環境)
docker run --rm -v $(pwd):/data phpdoc/phpdoc:latest \
-d /data/src -t /data/docs/api
常用參數速查
| 參數 | 說明 | 範例 |
-d, --directory | 掃描目錄(可多個,逗號分隔) | -d ./src,./lib |
-t, --target | 輸出目錄 | -t ./docs/api |
-f, --filename | 指定檔案(可多個) | -f ./src/App.php |
--ignore | 忽略路徑/檔案 | --ignore ./src/Tests,./vendor |
--template | 輸出模板 | --template=clean,abstract |
--encoding | 原始碼編碼 | --encoding=UTF-8 |
--title | 文件標題 | --title="My Project API" |
DocBlock 註釋規範全攻略
基本結構
/**
* 簡短描述(單行,結尾有句點)
*
* 詳細描述(可多行,支援 Markdown)
*
* @tag 值
* @tag 參數1 參數2 描述
*/
檔案層級註釋
<?php
/**
* 使用者管理服務
*
* 處理使用者註冊、認證、授權等核心業務邏輯
*
* @package App\Services
* @author 張三 <zhangsan@example.com>
* @version 2.1.0
* @license MIT
*/
類別註釋
/**
* 使用者實體類別
*
* 代表系統中的使用者,包含基本資料與認證相關屬性
*
* @package App\Models
* @property int $id
* @property string $email
* @property string $name
* @property Carbon $created_at
* @method static User find(int $id)
* @method static User where(string $column, mixed $value)
*/
class User extends Model {
// ...
}
屬性註釋
class User {
/**
* 使用者唯一識別碼
* @var int
* @readonly
*/
protected $id;
/**
* 電子郵件(唯一)
* @var string
* @validate email|unique:users
*/
protected $email;
/**
* 角色關聯
* @var Role|Collection
*/
protected $roles;
}
方法/函數註釋(核心)
/**
* 依條件查詢使用者
*
* @param array $filters 過濾條件 ['email' => '...', 'status' => 1]
* @param int $limit 最大筆數(預設 15)
* @param string[] $columns 要選取的欄位(預設 ['*'])
* @return User[]|Collection 使用者集合
* @throws \InvalidArgumentException 當 $filters 為空陣列
* @example
* $users = $service->findUsers(['status' => 1], 10);
* @see UserRepository::query()
* @deprecated 2.0 使用 UserRepository 取代
* @todo 加入快取機制
*/
public function findUsers(array $filters = [], int $limit = 15, array $columns = ['*']) {
if (empty($filters)) {
throw new \InvalidArgumentException('Filters cannot be empty');
}
// ...
}
常用標籤完整對照表
| 標籤 | 用途 | 適用對象 | 範例 |
@var | 變數/屬性型別 | property, variable | @var string|null |
@param | 參數說明 | method, function | @param int $id 使用者ID |
@return | 回傳值說明 | method, function | @return User|false |
@throws | 拋出例外 | method, function | @throws \Exception 描述 |
@author | 作者 | file, class, method | @author Name <email> |
@version | 版本 | file, class | @version 1.2.3 |
@since | 起始版本 | class, method | @since 2.0 |
@deprecated | 棄用說明 | all | @deprecated 2.0 Use newMethod() |
@see | 參考連結 | all | @see OtherClass::method() |
@link | 外部連結 | all | @link https://example.com |
@package | 邏輯分組 | file, class | @package App\Services |
@subpackage | 子分組 | class | @subpackage Auth |
@property | 魔術屬性 | class | @property string $name |
@method | 魔術方法 | class | @method static User find() |
@mixin | Mixin Trait | class | @mixin SoftDeletes |
@template | 泛型參數 | class (PHP 7.4+) | @template T of Model |
@phpstan-* | PHPStan 型別提示 | all | @phpstan-param array<string> $ids |
型別表示法規範(PSR-5 / PHPStan 相容)
| 型別 | 表示法 | 說明 |
| 基本型別 | int, string, bool, float, array, object, resource, callable, iterable | 小寫 |
| 可為 null | ?string 或 string|null | 推薦前者 |
| 陣列細節 | array<int, User>, string[], list<int> | PHPStan/PSR-5 |
| 聯合型別 | string|int|false | 用 | 分隔 |
| 物件/類別 | \Namespace\ClassName, ClassName, self, static | 建議完整命名空間 |
| Callable | callable(string, int): bool | 含簽章 |
| 物件形狀 | object{id: int, name: string} | PHPStan |
最佳實踐檢查清單
- [ ] 所有 public/protected 類別、方法、屬性皆有 DocBlock
- [ ] 型別宣告與實際程式碼一致(搭配 PHPStan 靜態分析驗證)
- [ ] @param/@return 描述「什麼情況回傳什麼」,而非重複型別
- [ ] 例外情況完整標註 @throws
- [ ] 棄用功能標註 @deprecated 並指引替代方案
- [ ] 複雜邏輯補充 @example 或詳細描述
- [ ] 執行
phpdoc --validate 檢查語法錯誤
- [ ] CI/CD 整合文件自動產生與發布
現代替代方案