【相關(guān)學(xué)習(xí)推薦:php圖文教程】
我們來(lái)開(kāi)門見(jiàn)山地說(shuō)。 PHP 是一門奇葩的語(yǔ)言。它既不快,語(yǔ)法又不漂亮。還沒(méi)有遵守良好的軟件開(kāi)發(fā)實(shí)踐。 但我還是使用它開(kāi)發(fā)了很多軟件。 那么問(wèn)題就很明顯了 為什么今天還在使用 PHP ?
除了個(gè)人理想主義的偏好以外,還有很多理由。這才是我們要討論的范圍。為什么選 PHP 作為我的 Web 開(kāi)發(fā)語(yǔ)言?
PHP 是什么?
「PHP 代表什么意思?」 或者這么問(wèn),「PHP 是什么?」 PHP 是一門編寫(xiě) web 頁(yè)面的語(yǔ)言,底層使用 C 語(yǔ)言實(shí)現(xiàn),使用 HTML 的標(biāo)簽語(yǔ)法包裹代碼。PHP 通常跑在服務(wù)端,與 web 服務(wù)器配合工作,負(fù)責(zé)把 HTML 加工完返回給訪問(wèn)者。
PHP 最初的意思是 「 Personal Home Page 」。因?yàn)檫@完全限制了使用該語(yǔ)言進(jìn)行一般使用的意義和可取性,所以該語(yǔ)言現(xiàn)在代表「 PHP:Hypertext Preprocessor」。這種寫(xiě)法被稱為遞歸縮寫(xiě)(一種全稱中引用自己的縮寫(xiě))。 極客們都喜歡用這種名字。
PHP 能做什么?
PHP 能用來(lái)做什么?通常來(lái)說(shuō) PHP 能做任何你想在 web 服務(wù)器上實(shí)現(xiàn)的東西。 比如說(shuō)做一個(gè)博客。實(shí)現(xiàn)一個(gè) SAAS 應(yīng)用也完全不在話下。寫(xiě)一個(gè)臨時(shí)處理數(shù)據(jù)的腳本也是得心應(yīng)手。又或者寫(xiě)了一個(gè)復(fù)雜的腳本,某一天突然變成了一門成功的軟件業(yè)務(wù)?過(guò)去也經(jīng)常發(fā)生。
如果你不相信我,可以看下 PHP 官網(wǎng)列出使用場(chǎng)景:
- 服務(wù)端腳本
- 命令行腳本
- 編寫(xiě)桌面應(yīng)用
我不太鼓勵(lì)最后一項(xiàng),但它確實(shí)可行。但是前兩項(xiàng)確實(shí)是很棒的理由 。
這就引出了一個(gè)重要且無(wú)法回避的事實(shí)…
PHP 無(wú)所不在
了解和喜愛(ài) PHP 的理由有非常多,可能最給力和有效的理由是:它可以在網(wǎng)絡(luò)的任何地方使用和運(yùn)行。如果你仔細(xì)尋找,你買到每月最低3美元的托管賬戶可能可以運(yùn)行 Python 或 Ruby 的 Web 應(yīng)用程序。但它肯定能運(yùn)行 PHP 。這意味著無(wú)論什么時(shí)候你都可以依賴 PHP 。
因?yàn)?PHP 可以運(yùn)行在任何地方,并且它容易上手,很多非常受歡迎的軟件都是用 PHP 寫(xiě)的。 WordPress 是對(duì)我影響最大和最熟悉的例子,除此之外,像 Joomla , Drupal , Magento , ExpressionEngine , vBulletin (是的,它仍然存在), MediaWiki 等這些工具,它們都在服務(wù)器上運(yùn)行 PHP 。
不僅如此,PHP 應(yīng)用框架更是多得數(shù)不勝數(shù), 比如:Symfony , Zend , Laravel , Aura , CakePHP , Yii 甚至是古老的 CodeIgnitor 框架。當(dāng)然你可以為其它任何一門語(yǔ)言制作一些長(zhǎng)度相當(dāng)?shù)?Web 框架列表。比如常用的 Web 語(yǔ)言像 Python , Ruby ,或 Node/JavaScript ,你甚至可以積累一個(gè)數(shù)字競(jìng)爭(zhēng)列表來(lái)跟 PHP 比較。但運(yùn)行 PHP 的網(wǎng)站數(shù)量龐大到無(wú)法估計(jì)。
WordPress 自豪地聲稱在互聯(lián)網(wǎng)上有 30% 的用戶量。 你甚至不需要相信這個(gè)說(shuō)法就會(huì)意識(shí)到許多的互聯(lián)網(wǎng)應(yīng)用必須使用 PHP 即使這個(gè)說(shuō)法甚至可以想象成是真的。
PHP 的優(yōu)點(diǎn)
動(dòng)態(tài)化特點(diǎn)
PHP 和 HTML 可以非常融洽地工作在一起。將 file.html
修改為 file.php
,即可在 <?php
和 ?>
標(biāo)簽里編寫(xiě) PHP 代碼,并且大部分的 Web 服務(wù)器默認(rèn)配置就是可以直接運(yùn)行 PHP 腳本。正因?yàn)槠溟T檻非常低,不需要懂太多編程知識(shí)的菜鳥(niǎo)程序員也可以直接上手操作,以至于產(chǎn)生了很多低品質(zhì)的代碼。
因?yàn)槠湟讓W(xué)性,大量的菜鳥(niǎo)程序員涌入,暴露出來(lái)另一個(gè) PHP 一直被人詬病的問(wèn)題:PHP 并沒(méi)有對(duì)自己是最好的 Web 服務(wù)器端語(yǔ)言有清晰的遠(yuǎn)景,當(dāng)然也沒(méi)為此做過(guò)太好的設(shè)計(jì)。導(dǎo)致走向了另一個(gè)結(jié)果,來(lái)自全球各地松散的合作,大雜燴般地貢獻(xiàn)代碼和想法,難以避免地,有一些壞的想法滲入其中。
擁有強(qiáng)大的面向?qū)ο蟀芾硎乾F(xiàn)在 PHP 中的一種標(biāo)準(zhǔn)
Composer 是 PHP 的加分項(xiàng)。
在 PHP 的開(kāi)發(fā)中,經(jīng)常會(huì)有一些奇葩的東西被發(fā)布出來(lái)。最著名的栗子當(dāng)屬 PHP 5.3 (廣泛的被視為 PHP 的第一個(gè)現(xiàn)代化版本 )中引入 goto
聲明。
類似的問(wèn)題是在 PHP 成長(zhǎng)過(guò)程中產(chǎn)生:面向?qū)ο笞畛跏亲鳛橐粋€(gè)有缺陷和有限制的概念來(lái)實(shí)現(xiàn)的,標(biāo)準(zhǔn)庫(kù)中充滿了不一致的名稱和參數(shù)排序,并且(舉個(gè)近來(lái)備受關(guān)注的栗子)在 PHP 5.3 中 ::
操作符無(wú)法識(shí)別時(shí),解析器會(huì)拋出可讀性很差的報(bào)錯(cuò)信息:語(yǔ)法錯(cuò)誤 (T_PAAMAYIM_NEKUDOTAYIM)
,如果不看文檔,你能用英文來(lái)理解這個(gè) T_PAAMAYIM_NEKUDOTAYIM
標(biāo)示的意思嗎?
但是現(xiàn)在,PHP 已經(jīng)完全支持 OOP。很少語(yǔ)言具有像 PHP 這樣類似 Java 的 OOP 實(shí)現(xiàn)。另外,與 Java不同的是,PHP 有一個(gè)單獨(dú)的并擁有廣泛支持的包管理器,叫作 Composer。它非常的好用,并且不容忽視的一點(diǎn)是它可以方便地引用優(yōu)質(zhì)且維護(hù)良好的庫(kù),具有很高的易用性。
PHP 的高速發(fā)展
通過(guò)這些事實(shí)發(fā)現(xiàn), PHP 正在以有趣的方式發(fā)展著。它正逐漸成為像java一樣功能齊全的面向?qū)ο笳Z(yǔ)言(更好或更糟糕),正在為函數(shù)式編程提供簡(jiǎn)單的抽象,這可以說(shuō)是當(dāng)前的熱點(diǎn)。并且,正在發(fā)展一套非常棒的工具, PHP 喜歡 Composer , 并有充分的理由 — 因?yàn)樗谝恍┐笮烷_(kāi)源項(xiàng)目的協(xié)同工作上做出了值得贊揚(yáng)的努力.
當(dāng)然,我們不應(yīng)該忘記當(dāng)前的熱點(diǎn):PHP 在 PHP7 系列版本中的發(fā)展取得了速度上的提升。這被廣泛認(rèn)為是由 Facbook 出現(xiàn)的 HHVM 引起的,在短時(shí)間內(nèi),存在 HHVM 的發(fā)展速度會(huì)破壞 PHP 社區(qū)的風(fēng)險(xiǎn),但事實(shí)并非如此,相反,PHP 的發(fā)展速度快得多,以至于人們幾乎忘記了 HHVM 的存在。
PHP 有一個(gè)巨大的社區(qū);它對(duì)新手友好。
如果你決定使用什么很酷的新技術(shù),我認(rèn)為經(jīng)常得到很少關(guān)注的是與語(yǔ)言達(dá)成協(xié)議的方式。學(xué)習(xí)PHP是什么感覺(jué)? PHP教程很好找,質(zhì)量通常也很好。
PHP流行的一個(gè)缺點(diǎn)是,你會(huì)從那些對(duì)工具不夠了解的人那里找到一些不那么好的教學(xué)?;蛘邚哪橙四抢飳W(xué)到的“最佳實(shí)踐”是十年前的。但總的來(lái)說(shuō),這很少見(jiàn),我不認(rèn)為它應(yīng)該讓你灰心?;蛘咄蝗话l(fā)現(xiàn)自己使用了幾個(gè)月的最佳實(shí)踐并不是最好的是很少見(jiàn)的,也不是一個(gè)大問(wèn)題。
PHP 與其他語(yǔ)言的比較
接下來(lái)我們要對(duì)比下 PHP 與其他的語(yǔ)言,這些語(yǔ)言需滿足以下要求:
-
開(kāi)源:意味著你可以自由、免費(fèi)地使用或者查看底層語(yǔ)言或者程序;
-
應(yīng)用于 Web 開(kāi)發(fā)領(lǐng)域:不一定是專注于 Web 開(kāi)發(fā),但是在 Web 開(kāi)發(fā)中有比較大的應(yīng)用;
-
高階動(dòng)態(tài)語(yǔ)言:具備動(dòng)態(tài)語(yǔ)言的特性,大部分面向 Web 應(yīng)用的語(yǔ)言兼具此特性;
-
足夠大的社區(qū):有很多滿足以上條件,但是只是在小范圍使用的語(yǔ)言,我們使用這最后一個(gè)條件將他們過(guò)濾掉。
為什么使用 PHP?而不是 JavaScript?
也許和 PHP 比較的最重要的語(yǔ)言是 JavaScript。現(xiàn)代開(kāi)發(fā)要求每個(gè)項(xiàng)目都至少會(huì)一點(diǎn) JavaScript 來(lái)進(jìn)行客戶端開(kāi)發(fā)和交互。借助 Node,這使得在服務(wù)器上使用 JS 變得相對(duì)簡(jiǎn)單。在服務(wù)器上和客戶端“同構(gòu)”使用相同的語(yǔ)言非常吸引人。
如同 PHP,JavaScript 是一個(gè)兼容并蓄但有時(shí)丑陋的語(yǔ)言,有很多的瑕疵和“陷阱”,但 JavaScript 在過(guò)去十年變得非??欤运那闆r是真實(shí)的。為什么選擇 PHP 而不是 JavaScript?你已有專業(yè)知識(shí)或者在 PHP 使用庫(kù)。否則,我認(rèn)為 JavaScript 或許是個(gè)更好的選擇。
PHP 對(duì)比動(dòng)態(tài)服務(wù)器頁(yè)面 (.Net Core)
動(dòng)態(tài)服務(wù)器語(yǔ)言起源于一個(gè)用于網(wǎng)友編程的 Microsoft 語(yǔ)言。他和 PHP 非常直接相似。但他運(yùn)行在 Windows 服務(wù)器環(huán)境。這被 ASP.net 取代了?,F(xiàn)在已被 ASP.NET Core 取代。后兩者現(xiàn)在是 PHP 一樣的開(kāi)源語(yǔ)言。而我個(gè)人從沒(méi)有在任何變體中寫(xiě)過(guò)一點(diǎn) ASP。
如果我使用且更喜歡 Microsoft 服務(wù)器的話,我會(huì)更喜歡 ASP。其他情況,請(qǐng)給我 PHP。兩者社區(qū)的規(guī)模和大小沒(méi)有可比性。
我應(yīng)該使用 Ruby 還是 PHP?
Ruby,特別是 Ruby on Rails,在過(guò)去十年前 非常 受歡迎。Ruby 依然是一個(gè)備受喜愛(ài)的語(yǔ)言,這在我看來(lái)他比 PHP 優(yōu)雅。也就是說(shuō),他的社區(qū)較小。同時(shí)我認(rèn)識(shí)到 Ruby 已經(jīng)不再是 "熱門語(yǔ)言"(被 JavaScript 取代了此角色)。Ruby 的優(yōu)雅,并且有足夠多的人擅長(zhǎng)使用,因此我不會(huì)避免他。但招聘已熟悉 Ruby 的人依舊比招聘 PHP 要難。(雖然我認(rèn)為一般的 Ruby 開(kāi)發(fā)者水平比相同的 PHP 開(kāi)發(fā)者要高。)
Python vs PHP:誰(shuí)更好一些?
最后一種與 PHP 一對(duì)一比較起來(lái)有意義的是 Python 。 Python 的使用場(chǎng)景要