PHP(PHP:Hypertext Preprocessor)即“超文本(ben)預處理(li)器”,是(shi)在服務(wu)器端執行的(de)(de)腳本(ben)語(yu)言,尤(you)其適用于Web開發并(bing)可嵌(qian)入HTML中。PHP語(yu)法(fa)學(xue)習了C語(yu)言,吸納Java和(he)Perl多個語(yu)言的(de)(de)特色發展出自(zi)己的(de)(de)特色語(yu)法(fa),并(bing)根據它們的(de)(de)長項(xiang)持續改進提升自(zi)己,例如java的(de)(de)面向對象編程,該語(yu)言當初創建(jian)的(de)(de)主要目標是(shi)讓開發人員(yuan)快速編寫出優質(zhi)的(de)(de)web網站。PHP同時支持面向對象和(he)面向過程的(de)(de)開發,使用上非(fei)常靈活。
PHP是(shi)(shi)一(yi)個(ge)擁(yong)有眾多(duo)開發者(zhe)的開源軟件項目,最(zui)開始是(shi)(shi)Personal Home Page的縮寫(xie),已(yi)經正式(shi)更名(ming)為"PHP:Hypertext Preprocessor"。PHP是(shi)(shi)在(zai)1994年(nian)由Rasmus Lerdorf創建的,最(zui)初只是(shi)(shi)一(yi)個(ge)簡單的用Perl語(yu)言編寫(xie)的統計他自己網站訪(fang)問者(zhe)數量(liang)(liang)的程序。后(hou)來重新用C語(yu)言編寫(xie),同時可以(yi)訪(fang)問數據庫,1995年(nian),PHP(Personal Home Page Tools)對外發表(biao)第一(yi)個(ge)版(ban)本PHP1。此后(hou),越(yue)來越(yue)多(duo)的網站開始使用PHP,并且(qie)強烈要求增加(jia)一(yi)些特性,如循環語(yu)句和數組變(bian)量(liang)(liang)等,1995年(nian)發布(bu)的PHP2加(jia)入(ru)了對mySQL的支持。
Andi Gutmans和(he)Zeev Suraski在為(wei)一(yi)所大(da)(da)學的(de)項(xiang)目中開發電子商務(wu)程序時發現PHP2功(gong)(gong)能(neng)明顯不足,于是他們重寫(xie)了代碼發布了PHP3。PHP3是類(lei)似(si)于現代PHP語法(fa)結(jie)構的(de)第一(yi)個(ge)版本,PHP3的(de)最強大(da)(da)的(de)功(gong)(gong)能(neng)是它(ta)的(de)可擴展性,PHP3的(de)新(xin)功(gong)(gong)能(neng)和(he)廣泛的(de)第三方數(shu)據庫、API的(de)支持使得這樣程序的(de)編寫(xie)成為(wei)可能(neng)。
PHP3官方發(fa)布(bu)不久,Andi Gutmans和(he)Zeev Suraski開始(shi)重新編寫(xie)PHP代碼。設(she)計(ji)目標是增強復(fu)雜程序運(yun)行(xing)時的(de)性能(neng)(neng)和(he)PHP自(zi)身(shen)代碼的(de)模(mo)塊性。經(jing)過(guo)不懈(xie)努力Zend引擎研發(fa)成功并(bing)且實(shi)現了(le)(le)設(she)計(ji)目標,并(bing)在1999年中期引入PHP。基(ji)于(yu)該引擎并(bing)結合了(le)(le)更(geng)多新功能(neng)(neng)的(de)PHP4于(yu)2000年5月正式發(fa)布(bu)。除(chu)了(le)(le)更(geng)高(gao)的(de)性能(neng)(neng)以(yi)外,PHP4還(huan)包含一些(xie)關鍵功能(neng)(neng),比如:支持(chi)更(geng)多的(de)web服務器、HTTP Sessions支持(chi)、輸(shu)出(chu)緩沖(chong)、更(geng)安全的(de)用戶輸(shu)入和(he)一些(xie)新的(de)語言結構(gou)。
PHP5于2004年7月正(zheng)式發(fa)(fa)(fa)(fa)布(bu),它的(de)核心(xin)是(shi)Zend引擎2代(PHP7是(shi)Zend加(jia)強版(ban)3代),引入(ru)了(le)新的(de)對象模型(xing)和(he)大量新功能(neng),開(kai)始(shi)支持(chi)面向對象編(bian)程(cheng)。隨著(zhu)PHP6經歷(li)長時間(jian)的(de)開(kai)發(fa)(fa)(fa)(fa)流(liu)產后,PHP5發(fa)(fa)(fa)(fa)布(bu)了(le)6個版(ban)本(ben)頑(wan)強的(de)支撐著(zhu)開(kai)源社(she)區(qu)的(de)發(fa)(fa)(fa)(fa)展,直(zhi)到(dao)2016-12-03那天迎來了(le)PHP 7.0的(de)發(fa)(fa)(fa)(fa)布(bu),其實(shi)PHP5.6已(yi)經包含(han)了(le)很(hen)多PHP6想實(shi)現的(de)特性,它為PHP7的(de)研發(fa)(fa)(fa)(fa)爭取了(le)寶(bao)貴的(de)時間(jian)。不負(fu)眾望PHP7.0對比(bi)PHP5.6性能(neng)整整提升了(le)2倍,PHP7的(de)成功發(fa)(fa)(fa)(fa)布(bu)讓很(hen)多核心(xin)開(kai)發(fa)(fa)(fa)(fa)成員回歸到(dao)PHP社(she)區(qu),并(bing)且(qie)在2021-11-26發(fa)(fa)(fa)(fa)布(bu)了(le)PHP8。和(he)php7系列相對比(bi),PHP8對各種變(bian)量判(pan)斷和(he)運算采(cai)用更(geng)嚴格的(de)驗證判(pan)斷模式,這點有利后續版(ban)本(ben)對jit的(de)性能(neng)優化。
PHP語言(yan)作為一種高級語言(yan),其特點是開源,在設計(ji)體系上屬于C語言(yan)體系,它可(ke)以讓很多(duo)接(jie)受過高等(deng)教(jiao)育的(de)初學(xue)者能很快接(jie)受并完(wan)成入(ru)門學(xue)習,簡單好上手容易找(zhao)工作自然粉絲多(duo)。如果數據量大及訪問(wen)壓力(li)大,可(ke)以集成redis、mysql分表分區分庫、elasticsearch搜(sou)索引擎、消息隊(dui)列(lie)寫保護和(he)php系統分布式集群部署等(deng)技術方案,緩(huan)解數據存儲、服務訪問(wen)和(he)數據檢(jian)索帶來的(de)巨大壓力(li)。
無論是(shi)(shi)大(da)中小型(xing)項(xiang)(xiang)目(mu),PHP都是(shi)(shi)一個(ge)十分(fen)適合(he)的(de)(de)(de)高(gao)(gao)級(ji)編程語言,是(shi)(shi)否適合(he)就(jiu)看(kan)項(xiang)(xiang)目(mu)研發(fa)團隊的(de)(de)(de)對(dui)它(ta)的(de)(de)(de)掌握程度(du)。但是(shi)(shi)對(dui)于較大(da)的(de)(de)(de)和更(geng)(geng)為復雜的(de)(de)(de)項(xiang)(xiang)目(mu),最常(chang)見的(de)(de)(de)php-fpm編程模式就(jiu)顯出它(ta)的(de)(de)(de)薄弱了(le)。針(zhen)對(dui)PHP-fpm暴露出的(de)(de)(de)一系列(lie)缺(que)點問(wen)題,最簡單靠譜的(de)(de)(de)方案就(jiu)是(shi)(shi)及時升(sheng)級(ji)兼容PHP的(de)(de)(de)高(gao)(gao)版本,PHP7.0.0對(dui)比PHP5.6性(xing)能提升(sheng)了(le)2倍,另(ling)外(wai)PHP7.4提供的(de)(de)(de)Preloading預(yu)加載機制實現了(le)部分(fen)程序常(chang)駐內存,獲取了(le)不錯的(de)(de)(de)性(xing)能提升(sheng),在PHP8又提供了(le)高(gao)(gao)效(xiao)的(de)(de)(de)JIT(Just-In-Time即時編譯)運算(suan)支(zhi)持(chi)。另(ling)外(wai)水平更(geng)(geng)高(gao)(gao)的(de)(de)(de)開發(fa)者可以轉向難度(du)更(geng)(geng)高(gao)(gao)的(de)(de)(de)php-cli編程,它(ta)能解(jie)決大(da)部分(fen)的(de)(de)(de)系統性(xing)能問(wen)題,無論是(shi)(shi)PHP7和PHP8都支(zhi)持(chi)這種模式的(de)(de)(de)編程。
經過二十多年的(de)發(fa)展(zhan)(zhan),隨著php-cli相(xiang)關(guan)組(zu)件(jian)的(de)快速發(fa)展(zhan)(zhan)和(he)完善(shan),PHP已經可(ke)以應用在TCP/UDP服(fu)務、高性(xing)能Web、WebSocket服(fu)務、物聯網(wang)、實(shi)時通訊、游戲、微服(fu)務等(deng)非Web領域的(de)系統研發(fa)。
根據W3Techs2019年(nian)12月6號發(fa)布的(de)統計(ji)數據,PHP在WEB網(wang)(wang)站(zhan)服務器端使用的(de)編程(cheng)語言所占份(fen)額高達78.9%。在內容管理(li)系統的(de)網(wang)(wang)站(zhan)中,有58.7%的(de)網(wang)(wang)站(zhan)使用WordPress(PHP開發(fa)的(de)CMS系統),這占所有網(wang)(wang)站(zhan)的(de)25.0%。
PHP常(chang)見(jian)的(de)(de)運行模(mo)式(shi)有2種,分別(bie)是(shi)php-fpm和(he)php-cli。當PHP選(xuan)擇運行在(zai)php-fpm模(mo)式(shi)下,所有的(de)(de)變(bian)量都(dou)是(shi)頁面(mian)(mian)級(ji)的(de)(de),無論是(shi)全(quan)局(ju)變(bian)量還是(shi)類(lei)的(de)(de)靜態成員,都(dou)會在(zai)頁面(mian)(mian)執行完畢后(hou)被清(qing)空。運行在(zai)php-cli模(mo)式(shi)下可(ke)以(yi)(yi)實現程序常(chang)駐內存,各種變(bian)量和(he)數據庫連接(jie)都(dou)能(neng)長久保存在(zai)內存實現資源(yuan)復(fu)(fu)用(yong)(yong),性(xing)能(neng)可(ke)以(yi)(yi)得(de)到很大(da)的(de)(de)提升(sheng),php-cli雖然開發比(bi)(bi)(bi)較(jiao)(jiao)復(fu)(fu)雜,但是(shi)能(neng)夠獲取更高的(de)(de)性(xing)能(neng),對開發者的(de)(de)要(yao)(yao)求比(bi)(bi)(bi)較(jiao)(jiao)高需要(yao)(yao)比(bi)(bi)(bi)較(jiao)(jiao)高的(de)(de)開發水平,比(bi)(bi)(bi)較(jiao)(jiao)常(chang)用(yong)(yong)的(de)(de)模(mo)式(shi)是(shi)結合swoole組(zu)件編寫cli框(kuang)架,各種變(bian)量能(neng)保存在(zai)跨進程的(de)(de)高性(xing)能(neng)共(gong)享內存Table,可(ke)以(yi)(yi)開發出支持(chi)熱(re)啟動的(de)(de)php-cli可(ke)靠各類(lei)應(ying)用(yong)(yong)系統(tong)。
php-fpm在(zai)PHP 5.3.3版本成為(wei)了(le)(le)(le)官方(fang)正(zheng)式組件(jian)(2011-07-22),它提供(gong)了(le)(le)(le)穩定可(ke)靠(kao)的(de)(de)(de)(de)進(jin)程管(guan)理服(fu)務(wu),進(jin)程不足時候可(ke)以智(zhi)能(neng)擴充數量,閑置時候可(ke)以自動回收(shou)銷毀多余的(de)(de)(de)(de)進(jin)程,同(tong)時它對程序的(de)(de)(de)(de)容錯能(neng)力很(hen)強(qiang)大運行非常(chang)(chang)穩定,可(ke)以應付企(qi)業級的(de)(de)(de)(de)開發需求。php-fpm友好的(de)(de)(de)(de)完成了(le)(le)(le)使用HTTP/HTTPS等TCP/IP互聯網協(xie)議(yi)下進(jin)行的(de)(de)(de)(de)用戶的(de)(de)(de)(de)輸入(ru)(ru)輸出(chu),頁面級生命周期(qi)各(ge)種資(zi)源用完即釋放,不存在(zai)內(nei)(nei)存泄漏的(de)(de)(de)(de)問(wen)題。php-fpm也提供(gong)有一些(xie)常(chang)(chang)駐(zhu)內(nei)(nei)存的(de)(de)(de)(de)技術(shu)支持,例如PHP 7.4引(yin)入(ru)(ru)的(de)(de)(de)(de)opcache.preload也能(neng)實(shi)現(xian)局部(bu)的(de)(de)(de)(de)PHP類和函(han)數的(de)(de)(de)(de)常(chang)(chang)駐(zhu)內(nei)(nei)存,不過這個方(fang)法(fa)不夠靈(ling)活,和服(fu)務(wu)器(qi)配置捆綁(bang)的(de)(de)(de)(de)太(tai)死了(le)(le)(le)。
php-cli因為能實現各(ge)類資源(yuan)的(de)(de)(de)常駐內存(cun),所以可以資源(yuan)復用,更(geng)高效完成多(duo)進程編(bian)程和異(yi)步編(bian)程,可以開(kai)(kai)發(fa)出(chu)負載能力更(geng)高的(de)(de)(de)應用系統。但(dan)是相對php-fpm的(de)(de)(de)簡單編(bian)程開(kai)(kai)發(fa),開(kai)(kai)發(fa)者要注意很多(duo)的(de)(de)(de)事項和需(xu)要做(zuo)很多(duo)附加的(de)(de)(de)控制器(qi)開(kai)(kai)發(fa),否則就無法實現期待中的(de)(de)(de)高性能。
首先開發者需(xu)(xu)要去實現可(ke)靠的進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)管理服務,保證(zheng)系統(tong)進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)遇到各(ge)類(lei)(lei)錯誤(wu)退出(chu)(chu)運行后(hou)能(neng)(neng)夠自動創建新的進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng),只有(you)這樣才(cai)能(neng)(neng)保證(zheng)后(hou)續的服務請求有(you)足夠空閑進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)可(ke)分配。每個業務代碼段都要做異常處理,讓進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)遇到非致命錯誤(wu)時候不會退出(chu)(chu),因為進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)重啟意味程(cheng)(cheng)(cheng)(cheng)序(xu)和各(ge)類(lei)(lei)資源需(xu)(xu)要再次加(jia)載,這個過程(cheng)(cheng)(cheng)(cheng)性(xing)能(neng)(neng)消耗不小(xiao),所以只有(you)進(jin)(jin)(jin)(jin)程(cheng)(cheng)(cheng)(cheng)穩定運行了常駐內存才(cai)有(you)意義。
其次因為(wei)常(chang)駐(zhu)內(nei)存(cun)(cun)(cun),編(bian)(bian)(bian)寫(xie)的(de)新的(de)程(cheng)(cheng)(cheng)序必(bi)須重啟服務才能生效(xiao),這(zhe)(zhe)一點習(xi)慣了fpm模(mo)式的(de)開發者會感到比較陌生。另(ling)外開發者需要(yao)手工釋放內(nei)存(cun)(cun)(cun),否(fou)則(ze)系(xi)統(tong)長時(shi)間運行后(hou)會出(chu)現內(nei)存(cun)(cun)(cun)泄露(lu)。同(tong)時(shi)在cli模(mo)式下,我們不能像fpm里直(zhi)接(jie)用(yong)$_SERVER、$_POST、$_GET、$_COOKI和$_FILES進(jin)行編(bian)(bian)(bian)程(cheng)(cheng)(cheng)工作,需要(yao)自己去解析各種互聯網通訊協議(yi)完成用(yong)戶的(de)輸(shu)入輸(shu)出(chu)。要(yao)實現多(duo)進(jin)程(cheng)(cheng)(cheng)編(bian)(bian)(bian)程(cheng)(cheng)(cheng)利用(yong)多(duo)核CPU計算,還有(you)學習(xi)使用(yong)pcntl和posix編(bian)(bian)(bian)程(cheng)(cheng)(cheng),這(zhe)(zhe)里涉及(ji)到了異步編(bian)(bian)(bian)程(cheng)(cheng)(cheng)邏輯,這(zhe)(zhe)塊難度還是比較大的(de)。比較常(chang)用(yong)的(de)模(mo)式是結合swoole組件編(bian)(bian)(bian)寫(xie)cli框架。
PHP是(shi)一(yi)(yi)個(ge)活躍的(de)社區開(kai)發語言,有專業(ye)的(de)核心開(kai)發團(tuan)隊在(zai)持續不斷(duan)的(de)迭(die)代,最近(jin)一(yi)(yi)個(ge)版本就是(shi)PHP 8.0.8引入了很(hen)多(duo)的(de)新特性。
(一)WordPress內容(rong)管(guan)理系統(CMS)
功能強大(da)、擴(kuo)展性強,易于擴(kuo)充功能;搭(da)建的博(bo)客對seo搜索引擎(qing)友好,收(shou)錄快排(pai)名靠前;網站上主題多,各(ge)色各(ge)樣應有盡有;有強大(da)的社區支(zhi)持,有上千萬(wan)的開發(fa)者貢獻和審查。
(二)Hyperf
Hyperf是(shi)一個基于(yu)(yu)(yu)(yu)Swoole高性能、高靈活性的(de)(de)漸進式PHP協程(cheng)框架(jia),內置協程(cheng)服務器及大量常用的(de)(de)組件(jian),性能較傳統基于(yu)(yu)(yu)(yu)PHP-FPM的(de)(de)框架(jia)有質的(de)(de)提(ti)升,提(ti)供超(chao)高性能的(de)(de)同(tong)時,也保(bao)持著(zhu)極其(qi)靈活的(de)(de)可擴(kuo)展性,標準組件(jian)均基于(yu)(yu)(yu)(yu)PSR標準實現,基于(yu)(yu)(yu)(yu)強(qiang)大的(de)(de)依賴注入(ru)設(she)計(ji),保(bao)證了絕大部(bu)分組件(jian)或(huo)類都是(shi)可替換與(yu)可復(fu)用的(de)(de)。
(三)ThinkPHP
ThinkPHP是一個快(kuai)速、兼容而且簡(jian)單的(de)(de)(de)輕量級國產PHP開發(fa)框架(jia),最早誕(dan)生于2006年初,遵循(xun)Apache2開源協(xie)議發(fa)布。秉承簡(jian)潔(jie)實用(yong)、出色的(de)(de)(de)性(xing)(xing)能(neng)(neng)和至簡(jian)的(de)(de)(de)代碼、注重易(yi)用(yong)性(xing)(xing)。并(bing)且擁(yong)有眾多原創(chuang)功(gong)能(neng)(neng)和特性(xing)(xing),在社區團隊的(de)(de)(de)積極參與下,在易(yi)用(yong)性(xing)(xing)、擴展性(xing)(xing)和性(xing)(xing)能(neng)(neng)方(fang)面不(bu)斷優化和改進。
(四)Drupal
Drupal誕(dan)生于2000年(nian),是一個基(ji)于PHP語言編寫的開(kai)發型CMF(內容管理(li)框架),即:CMS+framework。Drupal的架構由三大部分組(zu)成:內核(he)、模塊、主題(ti)。三者通過Hook機制緊(jin)密的聯系起來。可(ke)自由配置,能支(zhi)持從個人博客到(dao)大型社(she)區驅動的網站等(deng)各種不同(tong)應用(yong)的網站項(xiang)目。
(五)easyswoole
EasySwoole是一(yi)款常駐(zhu)內存(cun)型的國產分布式swoole框架(jia),支持同(tong)時(shi)混合監聽(ting)HTTP、WebSocket、自定義TCP、UDP協(xie)(xie)(xie)議(yi),且擁(yong)有豐富的組件,例(li)如協(xie)(xie)(xie)程(cheng)(cheng)(cheng)連接池、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)Kafka客(ke)(ke)戶(hu)端、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)ElasticSearch客(ke)(ke)戶(hu)端、、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)Redis客(ke)(ke)戶(hu)端、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)自定義隊列、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)Memcached客(ke)(ke)戶(hu)端、協(xie)(xie)(xie)程(cheng)(cheng)(cheng)HTTP客(ke)(ke)戶(hu)端、Crontab定時(shi)器(qi)等。
(六)Laravel
Laravel是一(yi)(yi)套簡潔(jie)、優雅的PHP Web開發框(kuang)架(PHP Web Framework)。它(ta)可以(yi)(yi)讓你從面條一(yi)(yi)樣雜亂的代碼中(zhong)解(jie)脫出來;它(ta)可以(yi)(yi)幫(bang)你構(gou)建一(yi)(yi)個(ge)不錯的網絡APP,而(er)且每行(xing)代碼都可以(yi)(yi)簡潔(jie)、富于表(biao)達力。
(七)CakePHP
CakePHP設計層面很優雅(ya),沒有自帶多余的library,所有的功能都是純粹(cui)的框(kuang)架,執行(xing)效率還不(bu)錯。
(八)imi
它(ta)可以(yi)運行在PHP-FPM、Swoole、Workerman多種(zhong)容器環境(jing)下
PHP有很(hen)多(duo)(duo)標準的(de)函數(shu)和(he)結構。還有一(yi)些函數(shu)需(xu)要(yao)和(he)特定的(de)擴展模塊一(yi)起編(bian)譯,否(fou)則在(zai)(zai)(zai)使用(yong)(yong)它們的(de)時候就(jiu)會得到一(yi)個致命(ming)的(de)“未定義(yi)函數(shu)”錯誤。例如(ru),要(yao)使用(yong)(yong)image函數(shu)中的(de)imagecreatetruecolor(),需(xu)要(yao)在(zai)(zai)(zai)編(bian)譯PHP的(de)時候加上GD的(de)支(zhi)持(chi)(chi)。或(huo)(huo)者要(yao)使用(yong)(yong)mysqli_connect()函數(shu),就(jiu)需(xu)要(yao)在(zai)(zai)(zai)編(bian)譯PHP的(de)時候加上MySQLi支(zhi)持(chi)(chi)。有很(hen)多(duo)(duo)核心(xin)函數(shu)已(yi)包含在(zai)(zai)(zai)每(mei)個版本的(de)PHP中如(ru)字符串和(he)變量函數(shu)。調用(yong)(yong)phpinfo()或(huo)(huo)者get_loaded_extensions()可以得知PHP加載了那(nei)些擴展庫。同時還應該注意,很(hen)多(duo)(duo)擴展庫默認就(jiu)是有效的(de)。
在PHP編(bian)程(cheng)里(li)需(xu)要注(zhu)意用(yong)戶的(de)輸入安全,對用(yong)戶各個方面的(de)輸入都要做好相(xiang)關的(de)過(guo)濾處理(li),內置(zhi)函(han)數(shu)里(li)提供了不少的(de)安全相(xiang)關的(de)函(han)數(shu),編(bian)程(cheng)學習者需(xu)要重點掌握(wo)以下(xia)的(de)7個重點函(han)數(shu)如(ru)下(xia)表格:
用戶(hu)輸入安全的7個內(nei)置函數
函數名稱 用途(tu)簡介(jie)
htmlentities 將字符轉換為 HTML 轉義字符
htmlspecialchars_decode 將特(te)殊的 HTML 實體(ti)轉換回普通字符(fu)
htmlspecialchars 將特殊(shu)字符轉(zhuan)換為 HTML 實體
nl2br 在字符串所有新行(xing)之前插入 HTML 換行(xing)標(biao)記(ji)
str_replace 子字符(fu)串替換
strip_tags 從(cong)字符串中去除 HTML 和 PHP 標記
stripslashes 反引(yin)用一個引(yin)用字符(fu)串
對于(yu)全部(bu)腳本而言,PHP提供了大量(liang)的預定(ding)義(yi)變(bian)量(liang)。這(zhe)些變(bian)量(liang)將(jiang)所有的外部(bu)變(bian)量(liang)表示成內建環境變(bian)量(liang),并(bing)且將(jiang)錯誤(wu)信息表示成返(fan)回頭。在PHP的編(bian)程(cheng)里(li)我們經常需(xu)要(yao)用到以下(xia)幾個(ge)系統(tong)變(bian)量(liang),編(bian)程(cheng)學習者需(xu)要(yao)重點掌握的7個(ge)預定(ding)義(yi)變(bian)量(liang)如下(xia)表格:
重點需要掌握的(de)7大預定義變量
變量名稱 變量用途說明
$GLOBALS 引用(yong)全(quan)局(ju)作(zuo)用(yong)域中可用(yong)的全(quan)部變量
$_SERVER 服(fu)務器和執行環(huan)境(jing)信息
$_GET HTTP GET 變量(liang)(用(yong)戶(hu)輸入之一)
$_POST HTTP POST 變量(用戶輸入之(zhi)一)
$_FILES HTTP 文件(jian)上傳變量
$_SESSION Session 變(bian)量(用戶會話)
$_COOKIE HTTP Cookies(用戶會話標識)
PHP支持10種原(yuan)始數據(ju)類(lei)型(xing)(xing)(xing)。四種標量類(lei)型(xing)(xing)(xing):bool(布爾型(xing)(xing)(xing))、int(整型(xing)(xing)(xing))、float(浮(fu)點(dian)型(xing)(xing)(xing),也稱作double)和string(字(zi)符串);四種復合類(lei)型(xing)(xing)(xing):array(數組)、object(對象)、callable(可(ke)調用)和iterable(可(ke)迭(die)代);最(zui)后(hou)是兩(liang)種特殊類(lei)型(xing)(xing)(xing):resource(資源(yuan))和NULL(無類(lei)型(xing)(xing)(xing))。
運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)是(shi)可以通過給出(chu)的一(yi)或(huo)多(duo)個(ge)(ge)(ge)值(zhi)(zhi)(用編程行(xing)話(hua)來說,表達式(shi))來產(chan)生(sheng)另一(yi)個(ge)(ge)(ge)值(zhi)(zhi)(因(yin)而整個(ge)(ge)(ge)結構成(cheng)為一(yi)個(ge)(ge)(ge)表達式(shi))的東西。PHP的運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)包(bao)含:運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)優先級、算(suan)(suan)(suan)(suan)(suan)術運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、賦值(zhi)(zhi)運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、位運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、比較運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、錯誤控制運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、執行(xing)運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、遞(di)(di)增(zeng)/遞(di)(di)減運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、邏輯運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、字符(fu)(fu)(fu)串運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)、數組運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)和類型運(yun)(yun)(yun)(yun)算(suan)(suan)(suan)(suan)(suan)符(fu)(fu)(fu)。
任何(he)PHP腳本都是由一(yi)(yi)系列語(yu)(yu)(yu)(yu)句(ju)構成(cheng)的,一(yi)(yi)條語(yu)(yu)(yu)(yu)句(ju)可以(yi)(yi)是一(yi)(yi)個(ge)(ge)(ge)賦值語(yu)(yu)(yu)(yu)句(ju)、一(yi)(yi)個(ge)(ge)(ge)函(han)數調用(yong)、一(yi)(yi)個(ge)(ge)(ge)循(xun)環、一(yi)(yi)個(ge)(ge)(ge)條件語(yu)(yu)(yu)(yu)句(ju)或者甚(shen)至(zhi)是一(yi)(yi)個(ge)(ge)(ge)什(shen)么也不做的語(yu)(yu)(yu)(yu)句(ju)(空(kong)語(yu)(yu)(yu)(yu)句(ju))。語(yu)(yu)(yu)(yu)句(ju)通常以(yi)(yi)分號結束,此外(wai)還可以(yi)(yi)用(yong)花括(kuo)號將一(yi)(yi)組語(yu)(yu)(yu)(yu)句(ju)封(feng)裝(zhuang)成(cheng)一(yi)(yi)個(ge)(ge)(ge)語(yu)(yu)(yu)(yu)句(ju)組,語(yu)(yu)(yu)(yu)句(ju)組本身可以(yi)(yi)當作是一(yi)(yi)行語(yu)(yu)(yu)(yu)句(ju)。
每個類的定義都以關鍵字class開頭,后面跟著類名,后面跟著一對花括號,里面包含有類的屬性與方法的定義。類名可以是任何非PHP保留字的合法標簽。一個合法類名以字母或下劃線開頭,后面跟著若干字母,數字或下劃線。以正則表達式表示為:^[a-zA-Z_
PHP是一個受(shou)眾大并且擁有(you)眾多(duo)開(kai)發者的(de)(de)(de)開(kai)源軟件項目(mu),Linux+Nginx+Mysql+PHP是它(ta)的(de)(de)(de)經典(dian)安裝部(bu)署(shu)方(fang)式,相關的(de)(de)(de)軟件全部(bu)都是開(kai)源免費(fei)的(de)(de)(de),所以使用(yong)PHP可以節約大量的(de)(de)(de)正版(ban)授權費(fei)用(yong)。不(bu)(bu)過(guo)PHP作為一個開(kai)源軟件,它(ta)缺乏大型科技公司的(de)(de)(de)支持(chi)背景,網絡上對(dui)它(ta)的(de)(de)(de)唱衰也是經久不(bu)(bu)衰,不(bu)(bu)過(guo)它(ta)的(de)(de)(de)持(chi)續迭代和性能持(chi)續增強(qiang)的(de)(de)(de)現實卻是鼓舞人心的(de)(de)(de),PHP社區用(yong)實際行動給予各種質疑強(qiang)有(you)力的(de)(de)(de)回(hui)擊。
PHP的內(nei)核(he)是C語(yu)(yu)言(yan)編寫的基礎好效率(lv)高,可(ke)以(yi)用(yong)C語(yu)(yu)言(yan)開(kai)(kai)發高性能(neng)的擴(kuo)展組(zu)件(jian);PHP的核(he)心包(bao)含了數(shu)量超過1000的內(nei)置(zhi)函數(shu),功能(neng)應(ying)有盡有很全(quan)面,開(kai)(kai)箱即用(yong)程序(xu)代(dai)(dai)碼(ma)簡潔;PHP數(shu)組(zu)支持動態(tai)擴(kuo)容,支持以(yi)數(shu)字、字符串或(huo)者混合鍵名的關聯數(shu)組(zu),能(neng)大幅提高開(kai)(kai)發效率(lv);PHP是一門弱類型(xing)語(yu)(yu)言(yan),程序(xu)編譯通過率(lv)高,相對(dui)其他強類型(xing)語(yu)(yu)言(yan)開(kai)(kai)發效率(lv)快;PHP天然熱部署,在php-fpm運行模式(shi)下代(dai)(dai)碼(ma)文件(jian)覆蓋即完成(cheng)熱部署;PHP經過20多年的發展,在互聯網上可(ke)以(yi)搜(sou)到(dao)海量的參考(kao)(kao)資料供(gong)參考(kao)(kao)學習。
PHP版(ban)(ban)本(ben)(ben)越高(gao)它的(de)(de)整體性能(neng)越高(gao),根據官方介紹,PHP7.0.0對比PHP5.6性能(neng)就提(ti)升了(le)(le)2倍(bei),PHP7.4已經比PHP7.0快了(le)(le)約30%,PHP8.0在(zai)性能(neng)上(shang)又相對PHP7.4大(da)(da)約改進了(le)(le)10%。PHP 8.0引入了(le)(le)JIT編譯器特性,同時加(jia)入多種新的(de)(de)語言功能(neng),例如(ru)命名(ming)參數、聯(lian)合(he)類型、注解、Constructor Property Promotion、match表達式、nullsafe運算符以及(ji)對類型系統、錯誤處理和一致(zhi)性的(de)(de)改進。PHP擁有自(zi)己的(de)(de)核心開(kai)發(fa)(fa)(fa)團隊(dui),保持(chi)5年發(fa)(fa)(fa)布(bu)一個(ge)大(da)(da)版(ban)(ban)本(ben)(ben)、1個(ge)月發(fa)(fa)(fa)布(bu)2個(ge)小版(ban)(ban)本(ben)(ben)的(de)(de)頻(pin)率,最(zui)新的(de)(de)版(ban)(ban)本(ben)(ben)是PHP8.08。PHP 7.0.0發(fa)(fa)(fa)布(bu)于2016-12-03,此版(ban)(ban)本(ben)(ben)下(xia)最(zui)新版(ban)(ban)本(ben)(ben)是PHP 7.4.21發(fa)(fa)(fa)布(bu)日(ri)期:2022-07-01),PHP 8.0.0發(fa)(fa)(fa)布(bu)于2021-11-26,此版(ban)(ban)本(ben)(ben)下(xia)最(zui)新版(ban)(ban)本(ben)(ben)是PHP 8.0.8(發(fa)(fa)(fa)布(bu)日(ri)期:2022-07-01)。
每個(ge)平臺(tai)(tai)都有對應(ying)的(de)php解釋器(qi)版本,指針對不同平臺(tai)(tai)均編譯(yi)出(chu)目標平臺(tai)(tai)的(de)二(er)進制碼(PHP解釋器(qi)),php開發(fa)的(de)程(cheng)序可以(yi)不經(jing)修改(gai)運行(xing)在(zai)windows、linux、unix等多個(ge)操作系統(tong)上。
php-cli模式下(xia)可以實(shi)現(xian)(xian)程(cheng)序常(chang)駐內存(cun)(cun),各種變量和(he)數據庫連(lian)接(jie)都能長久保(bao)存(cun)(cun)在內存(cun)(cun)實(shi)現(xian)(xian)資源復用(yong),比較常(chang)用(yong)的做法是結(jie)合swoole組件編寫cli框架。
在php-fpm模(mo)式下,所(suo)有的(de)(de)變(bian)量都是(shi)(shi)(shi)頁(ye)面級的(de)(de),無論是(shi)(shi)(shi)全局變(bian)量還是(shi)(shi)(shi)類的(de)(de)靜態成員,都會在頁(ye)面執行(xing)完畢后被(bei)清空,對程序員水(shui)平要求低,占用內存非常少,特別適合中小型系(xi)統的(de)(de)開發。