国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
引言:
Ruby on Rails催生變革
新一代框架的誕生
商業(yè)利益與大道至簡
國內(nèi)PHP開發(fā)框架
反思與進(jìn)取
首頁 php教程 php手冊 PHP的開發(fā)框架的現(xiàn)狀和展望

PHP的開發(fā)框架的現(xiàn)狀和展望

Jun 13, 2016 pm 12:33 PM
php rails ruby 外表 開發(fā) 引言 框架 火爆 現(xiàn)狀 隨著

PHP開發(fā)框架的現(xiàn)狀和展望

引言:

  隨著Ruby on Rails的火爆,PHP這個流行的Web應(yīng)用腳本語言也出現(xiàn)了大量的新一代開發(fā)框架。與此同時,國內(nèi)PHP開發(fā)者也開始緊跟國外發(fā)展,推出了不同的開發(fā)框架。

Ruby on Rails催生變革

  在RoR流行之前,PHP領(lǐng)域也有不少開發(fā)框架,例如Mojavi、WACT、PHPMvc和Seagull等。這些框架雖然也采用了MVC模式、數(shù)據(jù)庫抽象層等技術(shù)。但由于當(dāng)時PHP本身不像現(xiàn)在這樣流行,所以這些框架都沒有得到大量應(yīng)用,最終歸于沉寂。
  而在感受到RoR提供的快速開發(fā)能力后,PHP社區(qū)像被注入了興奮劑。各種應(yīng)用技術(shù)和開發(fā)框架層出不窮。

新一代框架的誕生

  PHP社區(qū)在被RoR震暈后,沒有陷入過多的爭論。而是立即行動起來,開始了新一代框架的設(shè)計。首先出現(xiàn)的第一批框架幾乎都是RoR的克隆。例如PHP on Trax(連名字都借鑒Ruby on Rails)和TaniPHP、Akelos等。這些框架最大的特點(diǎn)就是力求100%克隆RoR,不管是采用的架構(gòu)、設(shè)計模式,還是使用方法。
  這幾個框架一開始確實吸引了開發(fā)者的注意,但隨著開發(fā)者的深入了解,這些框架頭上的光環(huán)逐步褪色。晦澀難懂的架構(gòu)、糟糕的性能,以及太多的限制,讓這些框架難以在實際項目中運(yùn)用。
  此時,許多PHP開發(fā)者認(rèn)為可以借鑒RoR的設(shè)計思想,但不應(yīng)照搬RoR的結(jié)構(gòu)和實現(xiàn)。為此,一些同樣推崇快速開發(fā)的框架開始在PHP社區(qū)出現(xiàn)。這些框架中,CakePHP和Symfony可謂佼佼者。

CakePHP(http://www.cakephp.org/)
  CakePHP充滿了RoR的影子,從ActiveRecord模式到視圖的布局管理都和RoR非常相似。而且CakePHP一開始也嘗試實現(xiàn)與 RoR一樣的許多東西。但CakePHP的開發(fā)團(tuán)隊后來發(fā)現(xiàn)PHP語言和Ruby語言存在巨大區(qū)別,因此RoR中的許多設(shè)計即便能夠在PHP中實現(xiàn),也是缺乏實用價值的。
  CakePHP在發(fā)展中逐步走出了RoR的陰影,開始探索更能發(fā)揮PHP語言本身優(yōu)勢的架構(gòu)和實現(xiàn)。因此有一段時間CakePHP的API發(fā)生了劇烈的變化,以致其他開發(fā)者紛紛停下腳步處于觀望狀態(tài)。
  但由于前期一些架構(gòu)的不合理和對RoR太多的模仿,導(dǎo)致CakePHP的核心部分越來越難以理解,運(yùn)行性能也不盡人意。而且CakePHP將一個龐大的數(shù)據(jù)庫操作對象作為所有業(yè)務(wù)對象的基礎(chǔ)。這雖然利于快速開發(fā),但卻導(dǎo)致對業(yè)務(wù)邏輯對象的測試非常困難。
  對于較小型的項目,CakePHP非常理想。出色的快速開發(fā)能力、豐富的API和詳盡的文檔都可以幫助開發(fā)者很快完成工作。但隨著項目規(guī)模的增加,CakePHP的局限性也變得突出。

Symfony(http://www.symfony-project.com/)
  Symfony是一個非常成熟的框架,大量利用了已有的開源項目。Symfony使用Mojavi的核心代碼實現(xiàn)了框架的MVC模式,利用 Propel作為數(shù)據(jù)庫抽象層。Symfony不僅功能強(qiáng)大,而且對Ajax有全面的支持。加上官方網(wǎng)站提供的大量文檔和教程,并擁有一個活躍的社區(qū),因此受到許多開發(fā)者的歡迎。
  但是,Symfony最大的問題也在于使用了太多風(fēng)格迥異的開源項目來組合成框架。由于Mojavi和Propel本身都相當(dāng)復(fù)雜,因此Symfony的結(jié)構(gòu)非常復(fù)雜,難以理解和學(xué)習(xí)。
  不過對于希望選擇一個框架作為企業(yè)內(nèi)部系統(tǒng)基礎(chǔ)架構(gòu)的企業(yè)來說,Symfony的成熟度、豐富的文檔和活躍的社區(qū)都是值得考慮的。畢竟企業(yè)內(nèi)部系統(tǒng)更為看重的是穩(wěn)定性和長期的支持。

商業(yè)利益與大道至簡

  看到PHP開發(fā)框架的潛在商業(yè)價值后,Zend.com聯(lián)合IBM宣布將要推出一個真正能夠發(fā)揮PHP優(yōu)勢的開發(fā)框架。一時間,這個消息在整個PHP社區(qū)引起了地震。大家都開始期盼這個具有“官方”背景的開發(fā)框架能夠為PHP開發(fā)者指出一條正確的道路。
  不過世事難測,就在Zend Framework團(tuán)隊公布幾個代碼片斷后,立即就有開發(fā)者指出這些代碼片段是不可能實現(xiàn)的。事實證明這些代碼片段不過是美好的理想。限于PHP語言本身的能力,Zend Framework最終沒有實現(xiàn)當(dāng)初承諾提供的類似RoR中ActiveRecord模式的實現(xiàn)品。

Zend Framework(http://framework.zend.com/)
  Zend Framework大量應(yīng)用了PHP5中面向?qū)ο蟮男绿卣鳎航涌?、異常、抽象類、SPL等等。這些東西的應(yīng)用讓Zend Framework具有高度的模塊化和靈活性。同時,因為嚴(yán)格遵循“針對接口編程”和“單一對象職責(zé)”等原則,讓Zend Framework很有希望成為一個出色的企業(yè)應(yīng)用開發(fā)框架。
  但不幸的是Zend Framework直到今天,也沒有做出更多的突破。在使用Zend Framework開發(fā)時,框架對應(yīng)用程序自身最重要的領(lǐng)域邏輯分離沒有提供任何幫助。如果希望開發(fā)出真正健壯的企業(yè)應(yīng)用,仍然需要開發(fā)者做出相當(dāng)?shù)呐Γ⑶以赯end Framework之上建造自己的基礎(chǔ)設(shè)施。
  針對這點(diǎn),批評者指出Zend Framework雖然大量應(yīng)用PHP5的新特征,但卻沒有將這些相對于PHP4的優(yōu)勢轉(zhuǎn)化為能夠為開發(fā)者提供幫助的東西。

  對于簡單和小型的項目來說,Zend Framework不但不能提高開發(fā)效率。反而因為在框架中應(yīng)用了大量面向?qū)ο笤O(shè)計和PHP5的新特征,對開發(fā)者提出了更高的要求,間接增加了項目的開發(fā)成本。而對于較大的項目和企業(yè)應(yīng)用,Zend Framework倒是一個不錯的基礎(chǔ)。但要創(chuàng)建一個成功的應(yīng)用,仍然需要付出不小的努力。并且要時刻注意Zend Framewok的性能問題。

Code Igniter(http://www.codeigniter.com/)
  Code Igniter可以說是一匹黑馬。Code Igniter出現(xiàn)之時正是Symfony和CakePHP大行其道、Zend Framework萬眾期待的時刻??蓱{借著獨(dú)特的設(shè)計思想,Code Igniter吸引了大批開發(fā)者。這點(diǎn)從其火爆的官方論壇就可得到證實。
  Code Igniter推崇“簡單就是美”這一原則。沒有花哨的設(shè)計模式、沒有華麗的對象結(jié)構(gòu),一切都是那么簡單。幾行代碼就能開始運(yùn)行,再加幾行代碼就可以進(jìn)行輸出。大部分日常開發(fā)中用到的東西都可以立即找到,并且可以很容易的使用。Code Igniter可謂是“大道至簡”的典范。
  但是,Code Igniter本身的實現(xiàn)不太理想。內(nèi)部結(jié)構(gòu)過于混亂,雖然簡單易用,但缺乏擴(kuò)展能力。因此在發(fā)展到1.5系列版本時,作者不得不通過增加各種hooks來為框架提供擴(kuò)展能力。

國內(nèi)PHP開發(fā)框架

  國內(nèi)雖然過去也曾有開發(fā)者發(fā)布過一些框架,但這些框架要么太過簡單,要么和某一類型的應(yīng)用緊密耦合,缺乏通用性。直到進(jìn)入2006年,隨著PHP在國內(nèi)的大量應(yīng)用和追捧,真正的國產(chǎn)PHP開發(fā)框架才陸續(xù)發(fā)布。

FCS(http://fcs.org.cn/)
  FCS是從Java的Struts結(jié)構(gòu)移植過來的中文PHP開發(fā)框架,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu)和MVC模式,并且模擬實現(xiàn)了Struts的標(biāo)簽庫,借鑒了國外一些不錯的思想,尤其是Java框架方面,因此熟悉Java的開發(fā)人員相對比較容易上手,其模版引擎、緩存機(jī)制、認(rèn)證機(jī)制和擴(kuò)展性方面均表現(xiàn)不凡。
  在借鑒國外優(yōu)秀思想的同時,F(xiàn)CS也更多地考慮了國內(nèi)的應(yīng)用開發(fā)需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于國內(nèi)的主機(jī)環(huán)境和開發(fā)需要。秉著易用和易擴(kuò)展的原則,F(xiàn)CS采用容易理解的項目、模塊和操作機(jī)制加上內(nèi)置的一些自動化操作方法,讓應(yīng)用開發(fā)變得更加簡單,其功能可以通過基類庫以及各種插件的形式靈活擴(kuò)展,從而滿足日益增長的業(yè)務(wù)需求。正是因為具備良好的開發(fā)結(jié)構(gòu),使得FCS在開發(fā)大型應(yīng)用的時候并不會顯得有很多障礙,基于構(gòu)件的方式,以及配合框架的項目管理機(jī)制同樣可以讓你在處理大型應(yīng)用的時候一展所長。
  FCS力求精簡的代碼和全中文化的文檔、注釋,有利于國內(nèi)PHP開發(fā)人員學(xué)習(xí)和掌握,不過根據(jù)目前的情況來看,官方的文檔和社區(qū)支持目前還比較缺乏,而且對Ajax的支持還不夠全面,因此國內(nèi)的應(yīng)用成熟度還不夠。

FleaPHP(http://www.fleaphp.org/)
  FleaPHP從發(fā)展上看,是一個具有一定歷史的框架。在過去三年中,F(xiàn)leaPHP是作者發(fā)布了從PFC1到PFC3系列和flea1試驗框架后,推出的第一個真正成熟、穩(wěn)定的開發(fā)框架。
  與許多其他框架不同,F(xiàn)leaPHP設(shè)計之初,就是圍繞快速開發(fā)和充分利用PHP自身優(yōu)勢兩個重點(diǎn)展開的。因此FleaPHP最大的特點(diǎn)就是極高的模塊化程度和擴(kuò)展能力。
  FleaPHP框架的核心非常小,但通過靈活的配置,可以組合出各種類型的基礎(chǔ)架構(gòu)。對于簡單的腳本頁面,F(xiàn)leaPHP不需要載入MVC模式,只需要為應(yīng)用程序提供業(yè)務(wù)邏輯和數(shù)據(jù)庫服務(wù)。而對于復(fù)雜的應(yīng)用程序,F(xiàn)leaPHP可以完成從MVC模式調(diào)用、訪問控制、數(shù)據(jù)驗證到文件上傳、圖片處理等各種各樣的任務(wù)。
  正是因為這種出色的定制和擴(kuò)展能力,F(xiàn)leaPHP真正接近了“滿足從簡單應(yīng)用到企業(yè)開發(fā)的各種需求”這個目標(biāo)。而且與許多其他框架不同, FleaPHP是一個完全在實際開發(fā)中精煉出來的框架。因此伴隨著FleaPHP的發(fā)展,各種各樣的實際應(yīng)用也相繼出現(xiàn)。在FleaPHP官方網(wǎng)站上,可以看到各種各樣的實際應(yīng)用。從最簡單的企業(yè)宣傳網(wǎng)站,到復(fù)雜的社區(qū)網(wǎng)站、企業(yè)內(nèi)部系統(tǒng)等等,不一而足。

  FleaPHP作為一個完全國產(chǎn)的框架,具有完全中文化的文檔、代碼注釋,并且在擴(kuò)展功能上也注重考慮國內(nèi)開發(fā)者的實際需求。因此相對于國外的各種框架,F(xiàn)leaPHP更容易被國內(nèi)開發(fā)者所接受。
  但是,也正因為處在國內(nèi),F(xiàn)leaPHP面臨比國外同行多得多的困難。缺乏足夠的貢獻(xiàn)者、無禮的責(zé)難,以及充滿懷疑的眼光,這些都讓FleaPHP的開發(fā)團(tuán)隊成員需要更多的奉獻(xiàn)精神。而且由于缺乏足夠的貢獻(xiàn)者,F(xiàn)leaPHP框架目前在文檔和擴(kuò)展功能方面,與其他成熟框架相比還有不小的差距。
  并且與其他所有的PHP開發(fā)框架一樣,F(xiàn)leaPHP也沒有找到幫助開發(fā)者分離應(yīng)用程序領(lǐng)域邏輯的途徑。雖然有指導(dǎo)文檔,但對于初級開發(fā)者來說,一個可以拿來就用的領(lǐng)域邏輯基礎(chǔ)會顯得很實用。

反思與進(jìn)取

  RoR帶來的沖擊波還遠(yuǎn)為平息,但PHP開發(fā)者們已經(jīng)在開始反思一味追隨RoR的腳步是否真的能夠為PHP開發(fā)帶來質(zhì)變?
  RoR之所以能夠取得如此巨大的成功,除了RoR本身的設(shè)計思想外,還有一個重要原因就是RoR充分利用了Ruby這種語言的特長。將Ruby動態(tài)語言的優(yōu)勢發(fā)揮得淋漓盡致。而在PHP中如果只是單純照搬RoR中設(shè)計,則要處處遇到PHP語言本身的限制。為了繞開這些限制,開發(fā)者不得不用一些難以理解的技巧來解決問題。但這樣一來通常會導(dǎo)致框架的結(jié)構(gòu)變得晦澀難懂、性能受到損害。
  在這種反思中,Code Igniter、FleaPHP等框架就是對這個問題的最好回答。只有充分利用PHP語言本身的優(yōu)勢,才能真正讓PHP開發(fā)變得更簡單、更有趣。

  發(fā)展到今天,各種PHP開發(fā)框架雖然具有各自的特色,但幾乎都是為了提高開發(fā)效率而努力。但是,雖然其中部分框架注意到了提高應(yīng)用程序可維護(hù)性的問題,但都沒有為領(lǐng)域邏輯分離這個至關(guān)重要的問題提出解決方案。而這正是這些框架在未來的發(fā)展目標(biāo)。
  對于簡單的Web應(yīng)用和復(fù)雜的企業(yè)應(yīng)用,兩者之間的差別就注定了采用一種固定的架構(gòu)是無法滿足需求的。因此像FleaPHP這樣能夠提供自定義架構(gòu)能力的框架,可以讓開發(fā)者嘗試用一個框架的不同組合來解決從簡單到復(fù)雜的不同程度的需求。

  未來,PHP將成為Web開發(fā)領(lǐng)域中越來越重要的平臺。因此我們相信會出現(xiàn)更多更好的開發(fā)框架。雖然作為開發(fā)者來說,并不一定需要采用某一個框架來解決問題。但正是因為這些不斷出現(xiàn)的框架,我們對使用PHP開發(fā)Web應(yīng)用的理解和把握得到了一次次的推動。

?--------------------------------------

PS:此文原作者為FleaPHP 開發(fā)者之一.感謝其為國內(nèi)PHP作出的貢獻(xiàn)

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在PHP中獲取當(dāng)前的會話ID? 如何在PHP中獲取當(dāng)前的會話ID? Jul 13, 2025 am 03:02 AM

在PHP中獲取當(dāng)前會話ID的方法是使用session_id()函數(shù),但必須先調(diào)用session_start()才能成功獲取。 1.調(diào)用session_start()啟動會話;2.使用session_id()讀取會話ID,輸出類似abc123def456ghi789的字符串;3.若返回為空,檢查是否遺漏session_start()、用戶是否首次訪問或會話是否被銷毀;4.會話ID可用於日誌記錄、安全驗證和跨請求通信,但需注意安全性。確保正確開啟會話後即可順利獲取ID。

php從字符串獲取子字符串 php從字符串獲取子字符串 Jul 13, 2025 am 02:59 AM

要從PHP字符串中提取子字符串,可使用substr()函數(shù),其語法為substr(string$string,int$start,?int$length=null),若未指定長度則截取至末尾;處理多字節(jié)字符如中文時應(yīng)使用mb_substr()函數(shù)以避免亂碼;若需根據(jù)特定分隔符截取字符串,可使用explode()或結(jié)合strpos()與substr()實現(xiàn),例如提取文件名擴(kuò)展名或域名。

您如何執(zhí)行PHP代碼的單元測試? 您如何執(zhí)行PHP代碼的單元測試? Jul 13, 2025 am 02:54 AM

UnittestinginPHPinvolvesverifyingindividualcodeunitslikefunctionsormethodstocatchbugsearlyandensurereliablerefactoring.1)SetupPHPUnitviaComposer,createatestdirectory,andconfigureautoloadandphpunit.xml.2)Writetestcasesfollowingthearrange-act-assertpat

如何將字符串分為PHP中的數(shù)組 如何將字符串分為PHP中的數(shù)組 Jul 13, 2025 am 02:59 AM

在PHP中,最常用的方法是使用explode()函數(shù)將字符串拆分為數(shù)組。該函數(shù)通過指定的分隔符將字符串分割成多個部分並返回數(shù)組,語法為explode(separator,string,limit),其中separator為分隔符,string為原字符串,limit為可選參數(shù)控制最大分割數(shù)量。例如$str="apple,banana,orange";$arr=explode(",",$str);結(jié)果為["apple","bana

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時間,包括獲取當(dāng)前時間、測量執(zhí)行時間、操作時間點(diǎn)與持續(xù)時間及格式化解析時間。 1.獲取當(dāng)前時間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時鐘可能不單調(diào);2.測量執(zhí)行時間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時間點(diǎn)(time_point)和持續(xù)時間(duration)可相互操作,但需注意單位兼容性和時鐘紀(jì)元(epoch)

如何將會話變量傳遞給PHP中的另一頁? 如何將會話變量傳遞給PHP中的另一頁? Jul 13, 2025 am 02:39 AM

在PHP中,要將一個會話變量傳到另一個頁面,關(guān)鍵在於正確開啟會話並使用相同的$_SESSION鍵名。 1.每個頁面使用session變量前必須調(diào)用session_start(),且放在腳本最前面;2.在第一個頁面設(shè)置session變量如$_SESSION['username']='JohnDoe';3.在另一頁面同樣調(diào)用session_start()後通過相同鍵名訪問變量;4.確保每個頁面都調(diào)用session_start()、避免提前輸出內(nèi)容、檢查服務(wù)器上session存儲路徑可寫;5.使用ses

PHP標(biāo)頭位置不起作用 PHP標(biāo)頭位置不起作用 Jul 13, 2025 am 02:08 AM

遇到header('Location:...')不起作用的問題,常見原因及解決辦法如下:1.提前有輸出導(dǎo)致header失效,解決方法是確保跳轉(zhuǎn)前無任何輸出,包括空格、HTML或echo;2.include或require文件中存在多餘輸出或UTF-8BOM字符,應(yīng)檢查文件編碼並保存為“UTF-8無BOM”;3.建議在跳轉(zhuǎn)前使用ob_start()開啟輸出緩衝,並配合ob_end_flush()延遲輸出;4.跳轉(zhuǎn)後務(wù)必加上exit阻止後續(xù)代碼執(zhí)行;5.確保header()函數(shù)調(diào)用位於所有輸出之前。

See all articles