2024年12月15日 星期日

PHP 8 的新特性一覽

 PHP 8 在 2020 年底推出,為 PHP 語言帶來了許多令人興奮的新功能和性能提升。以下將詳細介紹這些特性,並適時加入圖示以幫助您更直觀地理解。

1. 聯合型別 (Union Types)

  • 定義: 允許變數同時持有多種型別的值。
  • 優點: 提高程式碼的靈活性和可讀性。
  • 範例:
    PHP
    function greet(string|int $name): string {
        return "Hello, $name!";
    }
    
  • 圖示:(圖示可顯示一個變數可以同時包含字串或整數型別的示意圖)

2. 具名參數 (Named Arguments)

  • 定義: 允許以名稱來傳遞參數,而不必按照順序。
  • 優點: 提高程式碼的可讀性,尤其是當函式有許多參數時。
  • 範例:
    PHP
    function createProduct(string $name, float $price, int $quantity = 1): Product {
        // ...
    }
    
    createProduct(price: 19.99, name: 'T-shirt');
    

3. match 表達式

  • 定義: 類似於 switch 語句,但語法更簡潔且功能更強大。
  • 優點: 提高程式碼的可讀性和效率。
  • 範例:
    PHP
    $shape = 'circle';
    $area = match ($shape) {
        'circle' => pi() * $radius ** 2,
        'rectangle' => $width * $height,
        default => throw new InvalidArgumentException("Unknown shape: $shape")
    };
    

4. 屬性 (Attributes)

  • 定義: 一種用於在類、方法、屬性等元素上添加元數據的方式。
  • 優點: 提高程式碼的可讀性和可維護性。
  • 範例:
    PHP
    #[Attribute]
    class FooAttribute {}
    
    #[Foo]
    class MyClass {}
    

5. 構造函式屬性提升 (Constructor Property Promotion)

  • 定義: 可以直接在構造函式中聲明並初始化屬性。
  • 優點: 簡化程式碼,減少重複。
  • 範例:
    PHP
    class User {
        public function __construct(public string $name, public int $age) {}
    }
    

6. null 安全操作符 (Nullsafe Operator)

  • 定義: 用於安全地訪問可能為 null 的屬性或方法。
  • 優點: 減少 null pointer exceptions。
  • 範例:
    PHP
    $user->address->city ?? 'Unknown';
    

7. 弱映射 (Weak Maps)

  • 定義: 一種特殊的映射,其鍵為弱引用。當鍵不再被引用時,該鍵值對將自動被垃圾回收。
  • 優點: 避免記憶體洩漏。

8. 即時編譯 (Just-In-Time Compilation, JIT)

  • 定義: 將 PHP 程式碼編譯成機器碼,以提高執行效率。
  • 優點: 顯著提升程式性能,尤其是對於 I/O 密集型應用。

9. 其他特性

  • 新增函式: str_contains(), str_starts_with(), str_ends_with() 等。
  • 類型系統改進: mixed 型別、可變參數型別等。

PHP8 引入了這三個新的字串處理函數,大幅簡化了我們判斷字串是否包含、以什麼開頭或以什麼結尾的邏輯。它們的設計更直觀,也更符合自然語言的表達方式。

str_contains() 函數

  • 功能: 判斷一個字串是否包含另一個子字串。
  • 語法: bool str_contains(string $haystack, string $needle)
  • 參數:
    • haystack: 要搜尋的字串。
    • needle: 要查找的子字串。
  • 返回值:
    • 如果 haystack 包含 needle,則返回 true,否則返回 false

示例:

PHP
$text = "Hello, world!";
if (str_contains($text, "world")) {
    echo "字串包含 'world'";
}

str_starts_with() 函數

  • 功能: 判斷一個字串是否以另一個字串開頭。
  • 語法: bool str_starts_with(string $haystack, string $needle)
  • 參數:
    • haystack: 要檢查的字串。
    • needle: 要比較開頭的字串。
  • 返回值:
    • 如果 haystackneedle 開頭,則返回 true,否則返回 false

示例:

PHP
$filename = "image.jpg";
if (str_starts_with($filename, "image")) {
    echo "檔案名稱以 'image' 開頭";
}

str_ends_with() 函數

  • 功能: 判斷一個字串是否以另一個字串結尾。
  • 語法: bool str_ends_with(string $haystack, string $needle)
  • 參數:
    • haystack: 要檢查的字串。
    • needle: 要比較結尾的字串。
  • 返回值:
    • 如果 haystackneedle 結尾,則返回 true,否則返回 false

示例:

PHP
$email = "user@example.com";
if (str_ends_with($email, ".com")) {
    echo "電子郵件地址為 .com";
}

為什麼要使用這些函數?

  • 簡潔易懂: 函數名稱直觀,表達意圖清晰。
  • 提高可讀性: 讓程式碼更易於理解和維護。
  • 避免冗餘: 不需要自己寫複雜的判斷邏輯。
  • 性能優化: 這些函數經過優化,執行效率更高。

與舊版 PHP 的比較

在 PHP8 之前,我們通常使用 strpos()substr() 等函數來實現類似的功能,但這些方法寫起來相對繁瑣,且容易出錯。而新的三個函數提供了更簡潔、更安全的方式。

總結

str_contains()str_starts_with()str_ends_with() 是 PHP8 中非常實用的字串處理函數,它們可以大大簡化我們的程式碼,提高開發效率。在處理字串相關的邏輯時,強烈建議使用這些函數。

沒有留言:

張貼留言