首頁 > 頭條 > 正文

PHP早已不是十年前的鳥樣

轉載 2019-05-18 10:32:31 2 3568
第七期線上培訓班
開發者 Brent 發布了一篇文章,詳細介紹了 2019 年的 PHP 是怎么樣的。

557d6bb8f114c6ada8c2b4fa9cb6c68.png

Brent 承認 PHP 當前仍然存在一些問題,比如許多核心函數仍然有不一致的方法簽名、配置設置還是令人困惑,但是以他自己的開發經驗來看,他認為 PHP 是 Web 開發的絕佳選擇,使用 PHP,他可以創建可靠、可維護和高質量的應用,并且自己與客戶對最終結果都滿意。(推薦學習:PHP7技術專題)

文章中 Brent 關注于 PHP 這些年來發展得好的一面,他通過幾下幾點,說明“PHP 不再是十年前那一門糟糕的語言了”:

● PHP 正在積極開發,每年都會發布新版本

● PHP 5 之后性能在不斷提高

● 有非常活躍的框架、包和平臺組成的語言生態

● PHP 在不斷發展,過去幾年中添加了許多新功能

● 各種開發工具在過去幾年中已經成熟,并且保持增長

PHP 正在積極開發,每年都會發布新版本

當前 PHP 版本是去年 12 月份發布的 7.3,7.4 預計在今年年底發布,而 PHP 8.0 將是 7.4 之后的下一個版本。

e4dc0161738f55d8fcff3c7253aa9b6.png

自從 5.X 時代以來,核心團隊希望每年發布一個新版本,在過去四年中他們成功維護了這么一個發布周期。通常每個新版本都會得到官方兩年時間的積極支持,之后有一年僅提供安全修復,其目的是激勵 PHP 開發人員盡可能保持更新。

47b0a5edf8304d71fff7d385a385ee4.png

更加具體的發布與維護周期可以查看 PHP 官網的介紹:

https://www.php.net/supported-versions.php

看到上邊這個表,你可能會發現版本號從 5 跳到了 7,那 PHP 6 去哪里了?

順便科普一下。其實早在 2005 年,PHP 社區就發起了 PHP 6,但由于實現 Unicode 面臨的困難太大,項目最終流產,PHP 官方沒有發布 PHP 6 GA,并且在 2010 年將 PHP 6 取消。雖然 PHP 6 項目取消了,但其大量已實現功能集成到了 PHP 5.X 中,包括 OOP 方面的改進,使得 PHP 從面向過程跨越到面向對象。

PHP 6 被取消了,但是之前對這個主要版本的研發都是以 PHP 6 的名義進行的,所以許多參考資料與書籍都是用“PHP 6”來指代該版本。官方擔心這在放棄 PHP 6 之后會引起混亂,于是干脆不使用 PHP 6.X 版本號,直接從 5 跳到 7。

詳情可以查看官方說明:

https://wiki.php.net/rfc/php6

PHP 5 之后性能在不斷提高

PHP 7.0 中,PHP 核心部分完全重寫,帶來了最新的 Zend 引擎,使得 PHP 性能提升了兩到三倍。

作者引用了 https://kinsta.com/blog/php-benchmarks 的基準測試來說明這一點,指出自 7.0 以來,PHP 性能一直在提升,PHP Web 應用與其它語言的 Web 框架相比在一些情況下性能好很多。但他也表示:“當然 PHP 框架不會勝過 C 與 Rust,但比 Rails 或 Django 好得多,與 ExpressJS 相當。”

有非常活躍的框架、包和平臺組成的語言生態

提到 PHP 的框架,不得不說 WordPress,但是作者表示 WordPress 絕對不代表當前的 PHP 生態:“PHP 框架再也不僅僅只有 WordPress 了”。

當前 PHP 中有兩個主要的 Web 應用開發框架:Symfony 與 Laravel,還有 Zend、Yii、Cake 與 Code Igniter 這些,此外還有不少較小的框架。

Symfony 與 Laravel 都擁有龐大的包和軟件生態,包括 admin 面板和 CRM、獨立軟件包、CI、分析器、Web socket 服務器、隊列管理器與支付集成等。

此外,近幾年 PHP 異步框架也興起了,Swoole、Amp 與 ReactPHP 是其中的佼佼者,它們是用 PHP 或其它語言編寫的框架和服務器,用來運行真正的異步 PHP。

作者認為衡量 PHP 生態當前狀況的一種方法是查看 Packagist 這個 PHP 主要軟件包存儲庫的數據。通過以下趨勢圖,可以發現軟件包數量呈指數增長,并且當前錄入軟件包有 223?217 個,總的安裝量達到了 14?827?204?847,PHP 生態已不再像以前那么弱小。

83538bb53dbfba3940913ffcd549499.png

各種版本的可用軟件包的數量

b455ab4c43ddc51906ef01c71dfb457.png

每月包被安裝數

39eb67f678dc7a3e753ee2eefc311ad.png

此外,還可以看看 PHP 使用統計與市場定位最新數據:

http://www.kknptx.tw/toutiao-418943.html

PHP 在不斷發展,過去幾年中添加了許多新特性

盡管 async 與 await 這兩個呼聲極高的特性還沒有實現,但是 PHP 這幾年新特性不斷出現,語言本身得到了各方面的改進。

下邊列出了一些關注度比較高的 PHP 新特性:

● Short closures

短閉包,也稱為箭頭函數,這是一種在 PHP 中編寫較短函數的方法。將閉包傳遞給 array_map 或 array_filter 等函數時,它可以發揮極大的作用。

// A collection of Post objects $posts = [/* … */];
$ids = array_map(fn($post) => $post->id, $posts);

● Null coalescing operator

空合并運算符,它類似于三元運算符,但左邊的操作數行為類似于 isset,而不是僅使用其布爾值。這使得此運算符對數組特別有用。它同時可在未設置變量時分配默認值。

$undefined ?? 'fallback'; // 'fallback'
$unassigned;
$unassigned ?? 'fallback'; // 'fallback'
$assigned = 'foo';
$assigned ?? 'fallback'; // 'foo'
'' ?? 'fallback'; // ''
'foo' ?? 'fallback'; // 'foo'
'0' ?? 'fallback'; // '0'
0 ?? 'fallback'; // 0
false ?? 'fallback'; // false

● Traits

Trait 是一種重用代碼的機制,它可以減少單繼承的某些限制。Traits 與類組合的語義定義了降低復雜性的方式,并避免了與多重繼承和 Mixins 相關的典型問題。

Trait 類似于類,但僅用于以細粒度和一致的方式對函數進行分組,它是對傳統繼承的補充,可以實現行為的橫向組合,類成員應用不需要繼承。

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>

● Typed properties

屬性類型化,類變量可以定義類型,比如:

class A
{
    public string $name;
    
    public Foo $foo;
}

● Spread operator

擴展運算符,這是一種新語法,可以直接在調用中解壓縮參數,比如:

call_user_func_array([$db, 'query'], array_merge(array($query), $params));

直接用新語法可擴展出數組 $params:

$db->query($query, ...$params);

● JIT compiler:PHP 8 中確認支持 JIT

JIT 是一種編譯器策略,它將代碼表述為一種中間狀態,在運行時將其轉換為依賴于體系結構的機器碼,并即時執行。在 PHP 中,這意味著 JIT 將為 Zend VM 生成的指令視為中間表述,并以依賴于體系結構的機器碼執行,也就是說托管代碼的不再是 Zend VM,而是更為底層的 CPU。

● FFI

Foreign Function Interface,外部函數接口,它允許從純腳本語言調用 C 函數、使用 C 數據類型,從而更有效地開發“系統代碼”。對于 PHP,FFI 開辟了一種使用純 PHP 編寫 PHP 擴展和綁定到 C 庫的方法。

● Anonymous classes

匿名類,用于創建簡單的一次性對象:

<?php
// Pre PHP 7 code
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}
$util->setLogger(new Logger());
// PHP 7+ code
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});

● Return type declarations

聲明返回類型:

<?php
function sum($a, $b): float {
    return $a + $b;
}
// Note that a float will be returned.
var_dump(sum(1, 2));
?>

嚴格模式:

<?php
declare(strict_types=1);
function sum($a, $b): int {
    return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

● Contemporary cryptography

使 Libsodium 成為核心擴展,Libsodium 是一個現代加密庫,由安全專家精心選擇的加密算法組成,以避免側信道漏洞。

● Generators

生成器,提供了一種簡單、無樣板實現迭代器的方法。

各種開發工具在過去幾年中已經成熟,并且保持增長

最后一部分,作者分析了當前 PHP 開發工具也在不斷成熟,并且保持增長。

他以靜態分析器為例,比如 Psalm、Phan 與 PHPStan,這些工具將靜態分析 PHP 代碼并報告任何類型錯誤與可能存在的 bug。在某種程度上,它們提供的功能可以與 TypeScript 的相媲美,但是因為 PHP 現在不提供轉換(transpile),所以不允許使用自定義語法。這意味著 PHP 開發需要依賴文檔,但其實 PHP 的創造者 Rasmus Lerdorf 曾經提到了向核心添加靜態分析引擎的想法。

受到 JavaScript 社區的啟發,目前 PHP 也有在進行轉換的相關研發,比如項目 Pre,它允許新的 PHP 語法轉換為普通的 PHP 代碼。雖然這個想法已經在 JavaScript 中被證明可行,但作者認為在 PHP 中,只有先提供了適當的 IDE 和靜態分析支持,它才有可能實現。

講完了 PHP 當前的這些變化,作者最后沒有以“PHP 是世界上最好的語言”作結語,相反,他是這樣說的:

All that being said, feel free to still think of PHP as a crappy language... I can say in confidence that I enjoy working with it.

話雖如此,但是還要繼續認為 PHP 是蹩腳的語言那也是可以的。我可以很自信地說我喜歡 PHP。

php中文網最新課程二維碼
  • 相關標簽:PHP
  • 本文轉載于:oschina,如有侵犯,請聯系刪除
  • 相關文章


  • 如何編譯php文件
  • 如何成為php架構師
  • php語言好學嗎?
  • PHP使用統計和市場定位最新報告
  • PHP早已不是十年前的鳥樣
  • 網友評論

    文明上網理性發言,請遵守 新聞評論服務協議

    我要評論 條評論
    血脈仙境
  • 血脈仙境 · 2019-05-22 00:08:52 1樓
  • 真的很強呀!!

  • 獨孤九賤(5)_ThinkPHP5視頻教程

    獨孤九賤(5)_ThinkPHP5視頻教程

    ThinkPHP是國內最流行的中文PHP開發框架,也是您Web項目的最佳選擇。《php.cn獨孤九賤(5)-ThinkPHP5視頻教程》課程以ThinkPHP5最新版本為例,從最基本的框架常識開始,將...

    獨孤九賤(4)_PHP視頻教程

    獨孤九賤(4)_PHP視頻教程

    江湖傳言:PHP是世界上最好的編程語言。真的是這樣嗎?這個梗究竟是從哪來的?學會本課程,你就會明白了。 PHP中文網出品的PHP入門系統教學視頻,完全從初學者的角度出發,絕不玩虛的,一切以實用、有用...

    獨孤九賤(1)_HTML5視頻教程

    獨孤九賤(1)_HTML5視頻教程

    《php.cn原創html5視頻教程》課程特色:php中文網原創幽默段子系列課程,以惡搞,段子為主題風格的php視頻教程!輕松的教學風格,簡短的教學模式,讓同學們在不知不覺中,學會了HTML知識。 ...

    ThinkPHP5實戰之[教學管理系統]

    ThinkPHP5實戰之[教學管理系統]

    本套教程,以一個真實的學校教學管理系統為案例,手把手教會您如何在一張白紙上,從零開始,一步一步的用ThinkPHP5框架快速開發出一個商業項目。

    PHP入門視頻教程之一周學會PHP

    PHP入門視頻教程之一周學會PHP

    所有計算機語言的學習都要從基礎開始,《PHP入門視頻教程之一周學會PHP》不僅是PHP的基礎部分更主要的是PHP語言的核心技術,是學習PHP必須掌握的內容,任何PHP項目的實現都離不開這部分的內容,通...

    作者信息

    藏色散人

    好好學習天天向上!

    最近文章
    python是什么公司開發 748
    python怎么計算加減乘除 591
    Python中eval有什么用 185

    相關視頻教程

  • PHP開發編碼規范 PHP開發編碼規范
  • PHP語法基礎與數據庫詳解教程 PHP語法基礎與數據庫詳解教程
  • PHP數據庫編程零基礎入門到精通 PHP數據庫編程零基礎入門到精通
  • ThinkPHP6.0極速入門(視頻教程) ThinkPHP6.0極速入門(視頻教程)
  • ThinkPHP6.0公益直播課 ThinkPHP6.0公益直播課
  • 相關視頻章節

    第七期線上培訓班 足彩吧合买平台