Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
者 | Brent
譯者 | 張?zhí)m月
這篇文章不在于解決關(guān)于 PHP 的那個(gè)永恒話題,而是想讓你了解,PHP 在這些年的進(jìn)展以及那些值得關(guān)注的特性與發(fā)展現(xiàn)狀。
之前,有一篇非常流行的博客文章是“PHP:那些糟糕的設(shè)計(jì)”,第一次讀到這篇博客的時(shí)候,我正在一個(gè)非常破舊的地方工作,處理著許多 PHP 遺留項(xiàng)目。這篇博客對(duì)我觸動(dòng)很深,我開(kāi)始思考是否要停止編程,換一份完全不同的工作。文章地址:
https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/
幸運(yùn)的是,很快我就換了一份工作,而 PHP 在 5.X 版本之后又有了很多新的改進(jìn)。今天,我要向那些不再使用 PHP 編程,或者陷入遺留項(xiàng)目的人致敬。
劇透:直到今天,PHP 仍有很多糟糕的東西,例如許多核心功能仍然存在不一致的方法簽名,仍然存在令人混淆的配置設(shè)置,仍然會(huì)有一些開(kāi)發(fā)者因?yàn)橹R(shí)的缺乏而導(dǎo)致寫的代碼很糟糕等等。
但是,本文我想把目光集中在 PHP 已經(jīng)改進(jìn)的地方上面,以及如何寫出更加干凈和易維護(hù)的 PHP 代碼。也許你不會(huì)改變對(duì) PHP 的看法,但很有可能,你會(huì)驚訝于過(guò)去幾年 PHP 的進(jìn)步。
更新:很多人希望我能夠展示一下實(shí)際代碼,這是我其中一個(gè)業(yè)余項(xiàng)目的源代碼,它是用 PHP 和 Laravel 寫的,另外還有一個(gè)是我們?cè)谵k公室負(fù)責(zé)維護(hù)的上百個(gè) OSS 包的列表。
讓我們先快速回顧一下 PHP 的版本發(fā)布周期。現(xiàn)在 PHP 的版本是 7.3,預(yù)計(jì) 2019 年末將發(fā)布 PHP 7.4,7.4 之后的版本將會(huì)是 PHP 8.0。
從 5.X 版本之后,PHP 核心團(tuán)隊(duì)一直在努力每年發(fā)布一個(gè)新版本,并且在過(guò)去的 4 年間,這一目標(biāo)一直完成得很好。
大致來(lái)說(shuō),每個(gè)新版本都會(huì)用 2 年時(shí)間進(jìn)行積極地支持,然后用一年進(jìn)行“安全修補(bǔ)”工作。這樣做的目的是促使 PHP 開(kāi)發(fā)者盡可能保持最新?tīng)顟B(tài),例如每年都升級(jí)比從 5.4 直接跳到 7.0 要簡(jiǎn)單得多。
PHP 具體的版本發(fā)布情況,可以查看:
https://www.php.net/supported-versions.php
搞清楚 PHP 的發(fā)展歷程后,我們來(lái)談?wù)劥蠹覍?duì) PHP 的常見(jiàn)誤解。
在 5.X 版本時(shí)代,PHP 的性能平均而言是最好的。而在 7.0 時(shí)代,大部分的 PHP 核心都從零開(kāi)始重寫了,其性能能夠達(dá)到之前的 2-3 倍。口說(shuō)無(wú)憑,幸運(yùn)的是,有人花了大量時(shí)間來(lái)測(cè)量 PHP 的性能,Kinsta 提供了一個(gè)很好的更新列表。
從 7.0 版本以來(lái),PHP 性能就只升不降。PHP web 應(yīng)用的性能可以和其他語(yǔ)言 web 框架的性能相提并論,甚至更高。具體測(cè)試情況可查看:
https://github.com/the-benchmarker/web-frameworks
當(dāng)然,PHP 框架的性能還無(wú)法超越 C 和 Rust,但是要比 Rails 或 Django 好,且能夠和 ExpressJS 相媲美。
在談到框架時(shí),PHP 已經(jīng)不再只是 WordPress 了。作為職業(yè)的 PHP 開(kāi)發(fā)者,我認(rèn)為,WordPress 無(wú)法從任何層面代表當(dāng)今的生態(tài)系統(tǒng)。
總體來(lái)說(shuō),有 2 個(gè)主要的 web 應(yīng)用框架以及一些相對(duì)而言較小的框架,如 Symfony 和 Laravel。除此之后,還有 Zend、Yii、Cake、 Code Igniter 等等。
如果你想了解現(xiàn)代 PHP 開(kāi)發(fā)究竟是什么樣子,那么就需要掌握 Symfony 和 Laravel 中的一個(gè),這 2 個(gè)框架都有龐大的生態(tài)系統(tǒng),包含各種包和產(chǎn)品。從管理面板和客戶關(guān)系管理系統(tǒng) (CRM) 到單獨(dú)的包,從持續(xù)集成 (CI) 到性能監(jiān)視工具,我們有無(wú)數(shù)的服務(wù)如 web 套接字服務(wù)器、隊(duì)列管理器、支付集成等等。
但是,這些框架都是為實(shí)際開(kāi)發(fā)而設(shè)計(jì)的。如果你需要純粹的內(nèi)容管理,WordPress 和 CraftCMS 是理想選擇,而且它們還會(huì)不斷優(yōu)化。
衡量 PHP 生態(tài)系統(tǒng)目前狀態(tài)的方法是看一看 Packagist,它是 PHP 主要的包倉(cāng)庫(kù)。在過(guò)去的時(shí)間里,它呈現(xiàn)出了指數(shù)式增長(zhǎng)的態(tài)勢(shì),每天 2500 萬(wàn)左右的下載量,足以說(shuō)明 PHP 生態(tài)系統(tǒng)已經(jīng)不再是過(guò)去那種弱者了。
Packagist 網(wǎng)站上列出了過(guò)去的包和版本數(shù)量:
除了應(yīng)用框架和內(nèi)容管理系統(tǒng) (CMS) 以外,我們還發(fā)現(xiàn),在過(guò)去幾年,異步框架也崛起了。
異步框架是指用 PHP 或其它語(yǔ)言編寫的框架和服務(wù)器,它們能夠讓用戶運(yùn)行真正異步的 PHP。異步框架的例子包括:Swoole、Amp 和 ReactPHP。
由于我們已經(jīng)進(jìn)入異步領(lǐng)域,具有大量 IO 的 web 套接字和應(yīng)用等東西在 PHP 世界中就變得非常重要。
另外,人們還談到了內(nèi)部郵件列表,在郵件列表中,PHP 核心開(kāi)發(fā)者討論了 PHP 語(yǔ)言的進(jìn)一步發(fā)展,例如增加 libuv 到核心之中。對(duì)于不熟悉 libuv 的人來(lái)說(shuō),libuv 同 Node.js 用于實(shí)現(xiàn)其所有異步性的庫(kù)一模一樣。
盡管異步 (async) 和等待 (await) 還未面市,但 PHP 在過(guò)去幾年已經(jīng)經(jīng)過(guò)了許多改進(jìn),下面便是 PHP 新特性的不完全列表:
盡管我們的主題是 PHP 的語(yǔ)言特性,但我還是覺(jué)得需要談一下 PHP 語(yǔ)言的開(kāi)發(fā)流程。雖然社區(qū)被允許提出 RFC,但仍有一個(gè)活躍的志愿者核心團(tuán)隊(duì)在推動(dòng) PHP 的發(fā)展。在添加一個(gè)新的語(yǔ)言特性之前,必須要進(jìn)行投票。只有獲得 2/3 多數(shù)選票的 RFC 才能被添加到核心中。
大約有 100 個(gè)人可以投票,但你不需要給每個(gè) RFC 投票。核心團(tuán)隊(duì)的成員毋庸置疑能夠投票,因?yàn)樗麄儽仨毦S護(hù)代碼庫(kù)。除了他們以外,還有一群人是單獨(dú)從 PHP 社區(qū)中挑選出來(lái)的,這些人員包括 PHP 文件的維護(hù)人員,PHP 整體項(xiàng)目的貢獻(xiàn)者,以及 PHP 社區(qū)中頗具威望的開(kāi)發(fā)者。
雖然大多數(shù)核心開(kāi)發(fā)是由志愿者組成的,但其中一名核心 PHP 開(kāi)發(fā)者 Nikita Popov 近期被 JetBrains 雇傭,并全職負(fù)責(zé)該語(yǔ)言的開(kāi)發(fā)。另外一個(gè)例子是 Linux 基金會(huì)決定投資 Zend 框架。上述這些雇傭和收購(gòu)行為確保了未來(lái) PHP 開(kāi)發(fā)的穩(wěn)定性。
除了核心本身,我們還目睹了過(guò)去幾年間工具的增長(zhǎng)。首先進(jìn)入我腦海的是靜態(tài)分析器如 Vimeo 發(fā)明的 Psalm,以及 Phan 和 PHPStan。
這些工具能夠靜態(tài)分析 PHP 代碼,并且報(bào)告打字錯(cuò)誤、可能的 bug 等等。在某些方面,它們提供的功能足以和 TypeScript 相媲美,但目前 PHP 還沒(méi)有被轉(zhuǎn)編譯 (transpile),因此它并不支持定制句法。
雖然這意味著我們必須依賴于文檔塊,但 PHP 的最初發(fā)明者 Rasmus Lerdorf 提出了將靜態(tài)分析引擎添加到核心之中的想法。這個(gè)想法潛力巨大,但任務(wù)量著實(shí)不小。
提到轉(zhuǎn)編譯,由于受到 JavaScript 社區(qū)的啟發(fā),有許多人試圖將 PHP 句法延伸到用戶空間中。一個(gè)名叫 Pre 的項(xiàng)目就做了這件事情:它支持新的已經(jīng)轉(zhuǎn)編譯為普通 PHP 代碼的 PHP 句法。
雖然這一想法已經(jīng)在 JavaScript 中得以實(shí)現(xiàn),但只有在提供了適當(dāng)?shù)募砷_(kāi)發(fā)環(huán)境 (IDE) 和靜態(tài)分析支持后,它才能在 PHP 工作。這一想法非常有趣,但還必須不斷完善,才能變成“主流”。
盡管 PHP 還有很多缺點(diǎn)和遺留問(wèn)題,但我可以充滿信心地說(shuō),我喜歡使用它。就我的經(jīng)驗(yàn)來(lái)看,它可以創(chuàng)建可靠、可維護(hù)和高質(zhì)量的軟件。如果使用得當(dāng),PHP 對(duì)于 web 開(kāi)發(fā)來(lái)說(shuō)是個(gè)非常棒的選擇。
英文原文
https://stitcher.io/blog/php-in-2019
新浪微博是國(guó)內(nèi)使用 PHP 語(yǔ)言的代表之一,前新浪微博首席架構(gòu)師惠新宸就是 PHP 開(kāi)發(fā)組的核心成員。2016 年,InfoQ 編輯約稿了新浪微博,分享了新浪微博的 PHP 7 升級(jí)實(shí)踐以及選型思路。文章年代雖然較為久遠(yuǎn)了,但背后的思路和實(shí)踐細(xì)節(jié)依舊值得參考,感興趣的同學(xué)可以在 InfoQ 公眾號(hào)對(duì)話框回復(fù)關(guān)鍵詞:PHP,獲取文章詳情。
請(qǐng)?jiān)?InfoQ 公眾號(hào)對(duì)話框回復(fù)關(guān)鍵詞,留言區(qū)回復(fù)無(wú)法接收的喲!
QCon 全球軟件開(kāi)發(fā)大會(huì)廣州站正在火熱進(jìn)行中,我們?yōu)?InfoQ 的讀者匯總了大會(huì) PPT,回復(fù)關(guān)鍵詞:PPT,即可下載!
hp與JavaScript的交互方式
php與JavaScript的交互答題可以分為三種,即:使用php生成JavaScript,使用cookies進(jìn)行數(shù)據(jù)交換,使用臨時(shí)文件進(jìn)行數(shù)據(jù)交換。
1.php生成JavaScript的方法,可以動(dòng)態(tài)生成JavaScript,使得在服務(wù)器端的位置,通過(guò)客戶端的JavaScript表現(xiàn)出來(lái)提升用戶體驗(yàn)。
在使用時(shí)注意,php生成JavaScript腳本的語(yǔ)法,不用與JavaScript語(yǔ)法混合。
2.使用Cookies進(jìn)行數(shù)據(jù)交換,可以在php與JavaScript腳本交換小數(shù)據(jù)量時(shí)使用。因?yàn)镃ookies與腳本代碼無(wú)關(guān),php與JavaScript都可以設(shè)置和
讀取Cookie,使得兩種語(yǔ)言在交換數(shù)據(jù)庫(kù)里,變得很簡(jiǎn)單。
3.使用臨時(shí)文件進(jìn)行數(shù)據(jù)交換,原理與使用Cookie進(jìn)行數(shù)據(jù)交換是一樣的,只不過(guò)是臨時(shí)文件存取的數(shù)據(jù)量更大,樣式更豐富。但使用臨時(shí)文件往往需要
更多的操作代碼。
例:使用php生成JavaScript
<?php
//使用php生成JavaScript
$var1 ="我是php變量";
$var2 ="PHP";
echo "<script>";
echo "var jsVar ='我是JavaScript變量';";
echo "var phpVar ='這是".$var2."與JavaScript組成變量';";
echo "alert(jsVar);";
echo "alert('".$var1."');";
echo "alert(phpVar);";
echo "</script>";
?>
運(yùn)行結(jié)果
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。