PHP 早已不是十年前的模樣

2021-03-06    分類(lèi): 網(wǎng)站建設(shè)

Brent 承認(rèn) PHP 當(dāng)前仍然存在一些問(wèn)題,比如許多核心函數(shù)仍然有不一致的方法簽名、配置設(shè)置還是令人困惑,但是以他自己的開(kāi)發(fā)經(jīng)驗(yàn)來(lái)看,他認(rèn)為 PHP 是 Web 開(kāi)發(fā)的好選擇,使用 PHP,他可以創(chuàng)建可靠、可維護(hù)和高質(zhì)量的應(yīng)用,并且自己與客戶對(duì)最終結(jié)果都滿意。

文章中 Brent 關(guān)注于 PHP 這些年來(lái)發(fā)展得好的一面,他通過(guò)幾下幾點(diǎn),說(shuō)明“PHP 不再是十年前那一門(mén)糟糕的語(yǔ)言了”:

  • PHP 正在積極開(kāi)發(fā),每年都會(huì)發(fā)布新版本
  • PHP 5 之后性能在不斷提高
  • 有非?;钴S的框架、包和平臺(tái)組成的語(yǔ)言生態(tài)
  • PHP 在不斷發(fā)展,過(guò)去幾年中添加了許多新功能
  • 各種開(kāi)發(fā)工具在過(guò)去幾年中已經(jīng)成熟,并且保持增長(zhǎng)

PHP 正在積極開(kāi)發(fā),每年都會(huì)發(fā)布新版本

當(dāng)前 PHP 版本是去年 12 月份發(fā)布的 7.3,7.4 預(yù)計(jì)在今年年底發(fā)布,而 PHP 8.0 將是 7.4 之后的下一個(gè)版本。

BranchInitial ReleaseActive Support UntilSecurity Support Until7.11 Dec 20162 years, 5 months ago1 Dec 20185 months ago1 Dec 2019in 6 months7.230 Nov 20171 year, 5 months ago30 Nov 2019in 6 months30 Nov 2020in 1 year, 6 months7.36 Dec 20185 months ago6 Dec 2020in 1 year, 6 months6 Dec 2021in 2 years, 6 months

自從 5.X 時(shí)代以來(lái),核心團(tuán)隊(duì)希望每年發(fā)布一個(gè)新版本,在過(guò)去四年中他們成功維護(hù)了這么一個(gè)發(fā)布周期。通常每個(gè)新版本都會(huì)得到官方兩年時(shí)間的積極支持,之后有一年僅提供安全修復(fù),其目的是激勵(lì) PHP 開(kāi)發(fā)人員盡可能保持更新。


更加具體的發(fā)布與維護(hù)周期可以查看 PHP 官網(wǎng)的介紹:

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

看到上邊這個(gè)表,你可能會(huì)發(fā)現(xiàn)版本號(hào)從 5 跳到了 7,那 PHP 6 去哪里了?

其實(shí)早在 2005 年,PHP 社區(qū)就發(fā)起了 PHP 6,但由于實(shí)現(xiàn) Unicode 面臨的困難太大,項(xiàng)目最終流產(chǎn),PHP 官方?jīng)]有發(fā)布 PHP 6 GA,并且在 2010 年將 PHP 6 取消。雖然 PHP 6 項(xiàng)目取消了,但其大量已實(shí)現(xiàn)功能集成到了 PHP 5.X 中,包括 OOP 方面的改進(jìn),使得 PHP 從面向過(guò)程跨越到面向?qū)ο蟆?/p>

PHP 6 被取消了,但是之前對(duì)這個(gè)主要版本的研發(fā)都是以 PHP 6 的名義進(jìn)行的,所以許多參考資料與書(shū)籍都是用“PHP 6”來(lái)指代該版本。官方擔(dān)心這在放棄 PHP 6 之后會(huì)引起混亂,于是干脆不使用 PHP 6.X 版本號(hào),直接從 5 跳到 7。

詳情可以查看官方說(shuō)明:https://wiki.php.net/rfc/php6

PHP 5 之后性能在不斷提高

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

作者引用了 https://kinsta.com/blog/php-benchmarks 的基準(zhǔn)測(cè)試來(lái)說(shuō)明這一點(diǎn),指出自 7.0 以來(lái),PHP 性能一直在提升,PHP Web 應(yīng)用與其它語(yǔ)言的 Web 框架相比在一些情況下性能好很多。但他也表示:“當(dāng)然 PHP 框架不會(huì)勝過(guò) C 與 Rust,但比 Rails 或 Django 好得多,與 ExpressJS 相當(dāng)。”

有非?;钴S的框架、包和平臺(tái)組成的語(yǔ)言生態(tài)

提到 PHP 的框架,不得不說(shuō) WordPress,但是作者表示 WordPress 絕對(duì)不代表當(dāng)前的 PHP 生態(tài):“PHP 框架再也不僅僅只有 WordPress 了”。

當(dāng)前 PHP 中有兩個(gè)主要的 Web 應(yīng)用開(kāi)發(fā)框架:Symfony 與 Laravel,還有 Zend、Yii、Cake 與 Code Igniter 這些,此外還有不少較小的框架。

Symfony 與 Laravel 都擁有龐大的包和軟件生態(tài),包括 admin 面板和 crm、獨(dú)立軟件包、CI、分析器、Web socket 服務(wù)器、隊(duì)列管理器與支付集成等。

此外,近幾年 PHP 異步框架也興起了,Swoole、Amp 與 ReactPHP 是其中的佼佼者,它們是用 PHP 或其它語(yǔ)言編寫(xiě)的框架和服務(wù)器,用來(lái)運(yùn)行真正的異步 PHP。

作者認(rèn)為衡量 PHP 生態(tài)當(dāng)前狀況的一種方法是查看 Packagist 這個(gè) PHP 主要軟件包存儲(chǔ)庫(kù)的數(shù)據(jù)。通過(guò)以下趨勢(shì)圖,可以發(fā)現(xiàn)軟件包數(shù)量呈指數(shù)增長(zhǎng),并且當(dāng)前錄入軟件包有 223?217 個(gè),總的安裝量達(dá)到了 14?827?204?847,PHP 生態(tài)已不再像以前那么弱小。


各種版本的可用軟件包的數(shù)量


每月包被安裝數(shù)


此外,還可以看看這個(gè) PHP 使用統(tǒng)計(jì)與市場(chǎng)定位最新數(shù)據(jù):

  • https://www.oschina.net/news/106695/w3techs-php-report-20190515

PHP 在不斷發(fā)展,過(guò)去幾年中添加了許多新特性

盡管 async 與 await 這兩個(gè)呼聲極高的特性還沒(méi)有實(shí)現(xiàn),但是 PHP 這幾年新特性不斷出現(xiàn),語(yǔ)言本身得到了各方面的改進(jìn)。

下邊列出了一些關(guān)注度比較高的 PHP 新特性:

  • Short closures

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

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

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

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

Trait 是一種重用代碼的機(jī)制,它可以減少單繼承的某些限制。Traits 與類(lèi)組合的語(yǔ)義定義了降低復(fù)雜性的方式,并避免了與多重繼承和 Mixins 相關(guān)的典型問(wèn)題。

Trait 類(lèi)似于類(lèi),但僅用于以細(xì)粒度和一致的方式對(duì)函數(shù)進(jìn)行分組,它是對(duì)傳統(tǒng)繼承的補(bǔ)充,可以實(shí)現(xiàn)行為的橫向組合,類(lèi)成員應(yīng)用不需要繼承。

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

屬性類(lèi)型化,類(lèi)變量可以定義類(lèi)型,比如:

class A{ public string $name; public Foo $foo;}
  • Spread operator

擴(kuò)展運(yùn)算符,這是一種新語(yǔ)法,可以直接在調(diào)用中解壓縮參數(shù),比如:

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

直接用新語(yǔ)法可擴(kuò)展出數(shù)組 $params:

$db->query($query, ...$params);
  • JIT compiler:PHP 8 確認(rèn)支持 JIT

JIT 是一種編譯器策略,它將代碼表述為一種中間狀態(tài),在運(yùn)行時(shí)將其轉(zhuǎn)換為依賴于體系結(jié)構(gòu)的機(jī)器碼,并即時(shí)執(zhí)行。在 PHP 中,這意味著 JIT 將為 Zend VM 生成的指令視為中間表述,并以依賴于體系結(jié)構(gòu)的機(jī)器碼執(zhí)行,也就是說(shuō)托管代碼的不再是 Zend VM,而是更為底層的 CPU。

  • FFI

Foreign Function Interface,外部函數(shù)接口,它允許從純腳本語(yǔ)言調(diào)用 C 函數(shù)、使用 C 數(shù)據(jù)類(lèi)型,從而更有效地開(kāi)發(fā)“系統(tǒng)代碼”。對(duì)于 PHP,F(xiàn)FI 開(kāi)辟了一種使用純 PHP 編寫(xiě) PHP 擴(kuò)展和綁定到 C 庫(kù)的方法。

  • Anonymous classes

匿名類(lèi),用于創(chuàng)建簡(jiǎn)單的一次性對(duì)象:

<?php// Pre PHP 7 codeclass 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

聲明返回類(lèi)型:

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

嚴(yán)格模式:

<?phpdeclare(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 成為核心擴(kuò)展,Libsodium 是一個(gè)現(xiàn)代加密庫(kù),由安全專(zhuān)家精心選擇的加密算法組成,以避免側(cè)信道漏洞。

  • Generators

生成器,提供了一種簡(jiǎn)單、無(wú)樣板實(shí)現(xiàn)迭代器的方法。

各種開(kāi)發(fā)工具在過(guò)去幾年中已經(jīng)成熟,并且保持增長(zhǎng)

最后一部分,作者分析了當(dāng)前 PHP 開(kāi)發(fā)工具也在不斷成熟,并且保持增長(zhǎng)。

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

受到 JavaScript 社區(qū)的啟發(fā),目前 PHP 也有在進(jìn)行轉(zhuǎn)換的相關(guān)研發(fā),比如項(xiàng)目 Pre,它允許新的 PHP 語(yǔ)法轉(zhuǎn)換為普通的 PHP 代碼。雖然這個(gè)想法已經(jīng)在 JavaScript 中被證明可行,但作者認(rèn)為在 PHP 中,只有先提供了適當(dāng)?shù)?IDE 和靜態(tài)分析支持,它才有可能實(shí)現(xiàn)。

講完了 PHP 當(dāng)前的這些變化,作者最后沒(méi)有以“PHP 是世界上最好的語(yǔ)言”作結(jié)語(yǔ),相反,他是這樣說(shuō)的:

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.

話雖如此,但是還要繼續(xù)認(rèn)為 PHP 是蹩腳的語(yǔ)言那也是可以的。我可以很自信地說(shuō)我喜歡 PHP。

分享標(biāo)題:PHP 早已不是十年前的模樣
URL鏈接:http://www.muchs.cn/news27/104527.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、品牌網(wǎng)站制作網(wǎng)站營(yíng)銷(xiāo)、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)