PHP8的這4個新特性可能讓你寫出更差勁的代碼

php武器庫 發佈 2022-12-20T11:21:11.832068+00:00

PHP8已經發布快兩年多了,這個版本為PHP帶來了大量的新功能。近年來,PHP大大提高了性能,並強化對OOP(面向對象程序設計)的使用,但仍然,PHP中也有很多值得慎重的考慮的用法。新版本有很多好的特性,比如JIT編譯器,他可以提高性能、提升構造函數屬性、結構化元數據。

PHP8已經發布快兩年多了,這個版本為PHP帶來了大量的新功能。近年來,PHP大大提高了性能,並強化對OOP(面向對象程序設計)的使用,但仍然,PHP中也有很多值得慎重的考慮的用法。新版本有很多好的特性,比如JIT編譯器,他可以提高性能、提升構造函數屬性、結構化元數據。但其中也有一些新功能,會助長不良的代碼編寫,以下是五個不良做法和例子。

空安全運算符

該運算符能夠在複雜的邏輯判斷中,節省大量的代碼。它很容易理解:如果鏈式調用中的某些內容為空,則直接返回為空。它能夠節省精力和代碼行數,避免了複雜的調用。在其它程式語言中也有這種用法,比如:JavaScript、C#。但這個用法怎麼會變差勁呢?

/** PHP 7 */
$country = null;if ($session !== null) {
 $user = $session->user;
 if ($user !== null) {
   $address = $user->getAddress();
    if ($Address !== null) {
       $country = $address->country;
     }
   }
}/** PHP 8 */
$country = $session?->user?->getAddress()?->country;

在上面的例子中,空運算符被過度的使用了,等需要調試的時候,你就不知道具體哪個東西才是Null,為此可能需要付出更多的精力去追蹤問題:到底那個是Null?是session?user?getAddress方法?還是country。

那應該如何避免掉進坑裡呢?也有很多辦法:

  • 儘可能使定義類型,如果你知道某個變量不能為空,則應當為它聲明類型。
  • 限制空安全運算符的鏈式調用次數,比如最多兩次。
  • 用健全的代碼處理Null的情況,儘可能防止調用空安全運算符

命名參數

一個方法最多應該定義幾個參數呢?我們在寫代碼的時候,會向方法裡添加越來越多的參數,每個人都會輕易的的這樣做。有新的邏輯?直接增加一個參數,然後用if判斷一下就可以了。但這是最糟糕的做法。比較好的做法是,把這些參數封裝在對象中。所以我們可以在團隊中做個規定,最多傳入三個參數,超過三個則必須定義在對象中。在PHP8中,添加了命名參數的特性,這樣,增加更多的參數會更方便,開發人員可能更不願意通過對象傳遞參數(可以通過getter或setter方法或斷言驗證參數),而是試圖添加一個新的參數。如果沒有嚴格的標準,方法的疊代就有可能提高代碼的複雜性。為了防止這種情況:

  • 在團隊中定義代碼規範,嚴格限制參數數量
  • 始終將參數和邏輯封裝在對象中

聯合類型

在新的版本中,PHP朝著更嚴格的類型化方向發展。表明他正在變得成熟,並且拋棄一些不良的行為和做法。 命名空間、特徵、標量類型聲明、返回類型聲明、匿名類等,都表明了這一點。 聯合類型隨之而來:

public function __construct(
    private int|float|string|null $number
  ) {}

但是這有可能是PHP8中最糟糕的功能之一。它明顯的降低了接口的實踐。它並沒有強制開發人員創建有抽象思維的接口,而是讓他們隨意的發揮。聯合類型可能會使一些情況變得更好,但似乎場景並不多。如果你打算將老的程序遷移到PHP8,那麼聯合類型可能會很好用,但此時你應該拆分代碼而不是添加更多奇怪的類型。你可以在團隊中執行嚴格的代碼規範,聯合類型不要超過兩個類型。

混合類型

這可能是最好的,也可以是最壞的東西。如果我們認為聯合類型不夠好,那麼混合類型就是徹底的糟糕的用法。


public function __construct(
    private mixed $number
  ) {}

相當於使用一個非常複雜的聯合類型 。

public function __construct(
    private array|bool|callable|int|float|null|object|resource|string $number
  ) {}

結尾

如果我們查看PHP開發人員的RFC,我們會看到PHP開發者們是如何努力的了解新特性,以及為什麼要添加這些新特性。但仍然,我們會看到有很多的開發人員會濫用這些特性。

總的來說,PHP8增加了一些危險的特性,可能會讓缺乏開發經驗的開發人員使用差勁的做法。

但仍然,對於新手來說,可能會有一些坑,但如果你有足夠的經驗,這些都是很棒的特性。

不過這只是一些特新的糟糕用法的例子,並不能說PHP變得更差勁了。任何語言都能找到這樣的例子。

但是換一種思維,語言應該更靈活,如何寫出更好的代碼,是程式設計師的責任,而不是「語言的責任」。因此不是PHP允許編寫差勁的代碼,而是每個人都有錯誤的使用習慣。

PHP是用戶驅動的語言,因此PHP開發者們,是在實現市場需要的功能。不過PHP的開發者也應當對PHP的發展有一個明確的方向和思路。如此靈活的用法,可能會讓更多的人的編碼風格變得更不同,可能會影響到語言的凝聚力。

參考原文: https://medium.com/efesent-solutions/5-new-features-in-php-8-that-promote-bad-practices-6b74ce40d2f2

原文標題:PHP8的這4個新特性可能讓你寫出更差勁的代碼

原文地址:https://phpreturn.com/index/a63a10f794b0d8.html

原文平台:PHP武器庫

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturn(PHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時註明出處。

關鍵字: