PHP Notice: Please no longer include "PHPUnit/Framework.php" in /usr/share/php/PHPUnit/Framework.php on line 50
執行 `phpunit unit/DBTest.php` 時出現,導致測試無法正常運行。
PHPUnit 3.5+ 採用 **PSR-0/PSR-4 自動載入**,不再需要手動 `require 'PHPUnit/Framework.php'`。此錯誤通常由以下情況引起:
# 1. 移除系統全域 PEAR 套件
sudo pear uninstall phpunit/PHPUnit phpunit/PHPUnit_MockObject phpunit/PHP_CodeCoverage phpunit/PHP_TokenStream phpunit/Text_Template phpunit/File_Iterator phpunit/PHP_Timer phpunit/DbUnit phpunit/PHPUnit_Selenium
# 2. 專案目錄初始化 Composer (若無)
composer require --dev phpunit/phpunit ^9.5 # 或 ^10.0 對應 PHP 8.1+
# 3. 執行使用 vendor 版本
./vendor/bin/phpunit unit/DBTest.php
# 4. phpunit.xml.dist 設定 bootstrap (自動載入)
# ...
# 1. 開啟 auto_discover (讓 PEAR 自動發現頻道)
sudo pear config-set auto_discover 1
# 2. 檢查已安裝套件版本
pear list -a -c pear.phpunit.de
# 3. 完整移除所有 phpunit 相關套件 (順序重要,有依賴提示時先移除被依賴者)
sudo pear uninstall phpunit/PHPUnit
sudo pear uninstall phpunit/PHPUnit_MockObject
sudo pear uninstall phpunit/PHP_CodeCoverage
sudo pear uninstall phpunit/PHP_TokenStream
sudo pear uninstall phpunit/File_Iterator
sudo pear uninstall phpunit/Text_Template
sudo pear uninstall phpunit/PHP_Timer
sudo pear uninstall phpunit/DbUnit
sudo pear uninstall phpunit/PHPUnit_Selenium
# 4. 重新安裝最新穩定版
sudo pear install pear.phpunit.de/PHPUnit
# 5. 驗證
phpunit --version
phpunit unit/DBTest.php
在測試啟動檔案 (如 `bootstrap.php` 或 `phpunit.xml` 的 `bootstrap`) 最頂端加入:
<?php
// 抑制特定 Notice
error_reporting(E_ALL & ~E_NOTICE);
// 或針對性過濾
set_error_handler(function ($severity, $message) {
if ($severity === E_NOTICE && str_contains($message, 'Please no longer include')) {
return true; // 忽略
}
return false;
}, E_NOTICE);
不建議長期使用,會掩蓋其他合法 Notice。
檢查專案中是否存在:
grep -r "PHPUnit/Framework.php" --include="*.php" .
grep -r "PHPUnit/Autoload.php" --include="*.php" .
發現則移除,現代 PHPUnit 僅需 `vendor/autoload.php` (Composer) 或 PEAR 自動載入即可。
| PHPUnit | PHP_CodeCoverage | PHPUnit_MockObject | PHP 版本 |
|---|---|---|---|
| 9.5.x | 8.0.x | 6.0.x | 7.3 - 8.0 |
| 10.0.x | 9.0.x | 7.0.x | 8.1 - 8.2 |
| 11.0.x | 10.0.x | 8.0.x | 8.2+ |
「Please no longer include PHPUnit/Framework.php」本質是**自動載入機制變更**與**版本錯位**的綜合結果。徹底移除 PEAR 全域安裝、改用 Composer 專案級管理、清理舊版 `require` 語句,即能從根本解決並獲得穩定、可重現的測試環境。