首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 型別約束完整指南:參數與回傳值型別宣告的進階應用

     編輯:PHP 綜合知識

弱型別語言的型別約束演進

PHP 本質是弱型別語言,變數無需宣告型別且可隨時改變。但自 PHP 5/7 起,引入參數型別宣告與回傳值型別宣告,讓開發者能在關鍵介面處建立契約,提升程式碼可靠度與 IDE 支援。

可約束的型別範圍

型別分類關鍵字說明支援版本
類別/介面ClassName / InterfaceName物件必須是該類別實例或實作該介面PHP 5.0+
陣列array必須為陣列PHP 5.1+
可呼叫物件callable函數、閉包、類別方法陣列等PHP 5.4+
標量型別int, float, bool, string基礎資料型別PHP 7.0+
可為 null?Type允許傳入 nullPHP 7.1+
void 回傳void不回傳任何值PHP 7.1+
never 回傳never函數不會正常返回(拋出例外/exit)PHP 8.1+
混合型別mixed任意型別PHP 8.0+
聯合型別Type1|Type2多種型別其中之一PHP 8.0+
交集型別Type1&Type2同時滿足多個介面PHP 8.1+

基本語法示範

// 參數型別宣告
function process(User $user, array $options, callable $callback) { /* ... */ }

// 回傳值型別宣告
function getUser(int $id): ?User {
    // 回傳 User 物件或 null
}

function calculate(float $a, float $b): float {
    return $a + $b;
}

// 嚴格模式(檔案最頂端宣告)
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

add(1, 2);     // 正常
add('1', '2'); // TypeError: 嚴格模式下字串不可自動轉換

強制模式 vs 嚴格模式

模式行為適用場景
強制模式 (預設)允許相容型別自動轉換(如 int → float、數字字串 → int)一般應用、漸進式導入型別宣告
嚴格模式 (strict_types=1)型別必須完全匹配,否則拋出 TypeError核心庫、高可靠度要求、團隊規範

重要:declare(strict_types=1) 僅影響該檔案內的函數呼叫,不影響被呼叫函數的定義檔案。這設計讓庫作者與使用者能各自選擇模式。

實務最佳實踐

  1. 公開 API 全面加上型別宣告:建立清晰契約,IDE 自動完成、靜態分析(PHPStan、Psalm)效果最佳
  2. 新專案啟用嚴格模式:在 composer.json 或專案規範要求所有檔案加上 declare(strict_types=1)
  3. 善用 nullable 型別:?User 比 User|null 更簡潔(PHP 7.1+)
  4. 避免過度使用 mixed:僅用於真正不關心型別的通用工具函數
  5. 聯集型別表達「或」關係:string|Stringable 替代介面繼承

型別約束與繼承規則 (Liskov 替換原則)

  • 子類別方法參數:可擴大型別範圍(逆變)
  • 子類別方法回傳:可縮小型別範圍(協變)
  • 介面實作遵循相同規則
interface Repository {
    public function find(int $id): ?Entity;
}

class UserRepository implements Repository {
    // 參數可擴大:int → int|string
    // 回傳可縮小:?Entity → ?User
    public function find(int|string $id): ?User { /* ... */ }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved