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

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

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

Jun 13, 2016 pm 12:33 PM
php rails ruby and Outlook develop introduction frame hot status quo of along with

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ù)。但由于當時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等。這些框架最大的特點就是力求100%克隆RoR,不管是采用的架構(gòu)、設(shè)計模式,還是使用方法。
  這幾個框架一開始確實吸引了開發(fā)者的注意,但隨著開發(fā)者的深入了解,這些框架頭上的光環(huán)逐步褪色。晦澀難懂的架構(gòu)、糟糕的性能,以及太多的限制,讓這些框架難以在實際項目中運用。
  此時,許多PHP開發(fā)者認為可以借鑒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ā)團隊后來發(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的核心部分越來越難以理解,運行性能也不盡人意。而且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不僅功能強大,而且對Ajax有全面的支持。加上官方網(wǎng)站提供的大量文檔和教程,并擁有一個活躍的社區(qū),因此受到許多開發(fā)者的歡迎。
  但是,Symfony最大的問題也在于使用了太多風格迥異的開源項目來組合成框架。由于Mojavi和Propel本身都相當復(fù)雜,因此Symfony的結(jié)構(gòu)非常復(fù)雜,難以理解和學習。
  不過對于希望選擇一個框架作為企業(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團隊公布幾個代碼片斷后,立即就有開發(fā)者指出這些代碼片段是不可能實現(xiàn)的。事實證明這些代碼片段不過是美好的理想。限于PHP語言本身的能力,Zend Framework最終沒有實現(xiàn)當初承諾提供的類似RoR中ActiveRecord模式的實現(xiàn)品。

Zend Framework(http://framework.zend.com/)
  Zend Framework大量應(yīng)用了PHP5中面向?qū)ο蟮男绿卣鳎航涌?、異常、抽象類、SPL等等。這些東西的應(yīng)用讓Zend Framework具有高度的模塊化和靈活性。同時,因為嚴格遵循“針對接口編程”和“單一對象職責”等原則,讓Zend Framework很有希望成為一個出色的企業(yè)應(yīng)用開發(fā)框架。
  但不幸的是Zend Framework直到今天,也沒有做出更多的突破。在使用Zend Framework開發(fā)時,框架對應(yīng)用程序自身最重要的領(lǐng)域邏輯分離沒有提供任何幫助。如果希望開發(fā)出真正健壯的企業(yè)應(yīng)用,仍然需要開發(fā)者做出相當?shù)呐?,并且在Zend Framework之上建造自己的基礎(chǔ)設(shè)施。
  針對這點,批評者指出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萬眾期待的時刻??蓱{借著獨特的設(shè)計思想,Code Igniter吸引了大批開發(fā)者。這點從其火爆的官方論壇就可得到證實。
  Code Igniter推崇“簡單就是美”這一原則。沒有花哨的設(shè)計模式、沒有華麗的對象結(jié)構(gòu),一切都是那么簡單。幾行代碼就能開始運行,再加幾行代碼就可以進行輸出。大部分日常開發(fā)中用到的東西都可以立即找到,并且可以很容易的使用。Code Igniter可謂是“大道至簡”的典范。
  但是,Code Igniter本身的實現(xiàn)不太理想。內(nèi)部結(jié)構(gòu)過于混亂,雖然簡單易用,但缺乏擴展能力。因此在發(fā)展到1.5系列版本時,作者不得不通過增加各種hooks來為框架提供擴展能力。

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

  國內(nèi)雖然過去也曾有開發(fā)者發(fā)布過一些框架,但這些框架要么太過簡單,要么和某一類型的應(yīng)用緊密耦合,缺乏通用性。直到進入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的標簽庫,借鑒了國外一些不錯的思想,尤其是Java框架方面,因此熟悉Java的開發(fā)人員相對比較容易上手,其模版引擎、緩存機制、認證機制和擴展性方面均表現(xiàn)不凡。
  在借鑒國外優(yōu)秀思想的同時,F(xiàn)CS也更多地考慮了國內(nèi)的應(yīng)用開發(fā)需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于國內(nèi)的主機環(huán)境和開發(fā)需要。秉著易用和易擴展的原則,F(xiàn)CS采用容易理解的項目、模塊和操作機制加上內(nèi)置的一些自動化操作方法,讓應(yīng)用開發(fā)變得更加簡單,其功能可以通過基類庫以及各種插件的形式靈活擴展,從而滿足日益增長的業(yè)務(wù)需求。正是因為具備良好的開發(fā)結(jié)構(gòu),使得FCS在開發(fā)大型應(yīng)用的時候并不會顯得有很多障礙,基于構(gòu)件的方式,以及配合框架的項目管理機制同樣可以讓你在處理大型應(yīng)用的時候一展所長。
  FCS力求精簡的代碼和全中文化的文檔、注釋,有利于國內(nèi)PHP開發(fā)人員學習和掌握,不過根據(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)勢兩個重點展開的。因此FleaPHP最大的特點就是極高的模塊化程度和擴展能力。
  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ù)。
  正是因為這種出色的定制和擴展能力,F(xiàn)leaPHP真正接近了“滿足從簡單應(yīng)用到企業(yè)開發(fā)的各種需求”這個目標。而且與許多其他框架不同, 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)的框架,具有完全中文化的文檔、代碼注釋,并且在擴展功能上也注重考慮國內(nèi)開發(fā)者的實際需求。因此相對于國外的各種框架,F(xiàn)leaPHP更容易被國內(nèi)開發(fā)者所接受。
  但是,也正因為處在國內(nèi),F(xiàn)leaPHP面臨比國外同行多得多的困難。缺乏足夠的貢獻者、無禮的責難,以及充滿懷疑的眼光,這些都讓FleaPHP的開發(fā)團隊成員需要更多的奉獻精神。而且由于缺乏足夠的貢獻者,F(xiàn)leaPHP框架目前在文檔和擴展功能方面,與其他成熟框架相比還有不小的差距。
  并且與其他所有的PHP開發(fā)框架一樣,F(xiàn)leaPHP也沒有找到幫助開發(fā)者分離應(yīng)用程序領(lǐng)域邏輯的途徑。雖然有指導(dǎo)文檔,但對于初級開發(fā)者來說,一個可以拿來就用的領(lǐng)域邏輯基礎(chǔ)會顯得很實用。

反思與進取

  RoR帶來的沖擊波還遠為平息,但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)用程序可維護性的問題,但都沒有為領(lǐng)域邏輯分離這個至關(guān)重要的問題提出解決方案。而這正是這些框架在未來的發(fā)展目標。
  對于簡單的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作出的貢獻

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to get the current session ID in PHP? How to get the current session ID in PHP? Jul 13, 2025 am 03:02 AM

The method to get the current session ID in PHP is to use the session_id() function, but you must call session_start() to successfully obtain it. 1. Call session_start() to start the session; 2. Use session_id() to read the session ID and output a string similar to abc123def456ghi789; 3. If the return is empty, check whether session_start() is missing, whether the user accesses for the first time, or whether the session is destroyed; 4. The session ID can be used for logging, security verification and cross-request communication, but security needs to be paid attention to. Make sure that the session is correctly enabled and the ID can be obtained successfully.

PHP get substring from a string PHP get substring from a string Jul 13, 2025 am 02:59 AM

To extract substrings from PHP strings, you can use the substr() function, which is syntax substr(string$string,int$start,?int$length=null), and if the length is not specified, it will be intercepted to the end; when processing multi-byte characters such as Chinese, you should use the mb_substr() function to avoid garbled code; if you need to intercept the string according to a specific separator, you can use exploit() or combine strpos() and substr() to implement it, such as extracting file name extensions or domain names.

How do you perform unit testing for php code? How do you perform unit testing for php code? Jul 13, 2025 am 02:54 AM

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

How to split a string into an array in PHP How to split a string into an array in PHP Jul 13, 2025 am 02:59 AM

In PHP, the most common method is to split the string into an array using the exploit() function. This function divides the string into multiple parts through the specified delimiter and returns an array. The syntax is exploit(separator, string, limit), where separator is the separator, string is the original string, and limit is an optional parameter to control the maximum number of segments. For example $str="apple,banana,orange";$arr=explode(",",$str); The result is ["apple","bana

JavaScript Data Types: Primitive vs Reference JavaScript Data Types: Primitive vs Reference Jul 13, 2025 am 02:43 AM

JavaScript data types are divided into primitive types and reference types. Primitive types include string, number, boolean, null, undefined, and symbol. The values are immutable and copies are copied when assigning values, so they do not affect each other; reference types such as objects, arrays and functions store memory addresses, and variables pointing to the same object will affect each other. Typeof and instanceof can be used to determine types, but pay attention to the historical issues of typeofnull. Understanding these two types of differences can help write more stable and reliable code.

Using std::chrono in C Using std::chrono in C Jul 15, 2025 am 01:30 AM

std::chrono is used in C to process time, including obtaining the current time, measuring execution time, operation time point and duration, and formatting analysis time. 1. Use std::chrono::system_clock::now() to obtain the current time, which can be converted into a readable string, but the system clock may not be monotonous; 2. Use std::chrono::steady_clock to measure the execution time to ensure monotony, and convert it into milliseconds, seconds and other units through duration_cast; 3. Time point (time_point) and duration (duration) can be interoperable, but attention should be paid to unit compatibility and clock epoch (epoch)

How does PHP handle Environment Variables? How does PHP handle Environment Variables? Jul 14, 2025 am 03:01 AM

ToaccessenvironmentvariablesinPHP,usegetenv()orthe$_ENVsuperglobal.1.getenv('VAR_NAME')retrievesaspecificvariable.2.$_ENV['VAR_NAME']accessesvariablesifvariables_orderinphp.iniincludes"E".SetvariablesviaCLIwithVAR=valuephpscript.php,inApach

How to pass a session variable to another page in PHP? How to pass a session variable to another page in PHP? Jul 13, 2025 am 02:39 AM

In PHP, to pass a session variable to another page, the key is to start the session correctly and use the same $_SESSION key name. 1. Before using session variables for each page, it must be called session_start() and placed in the front of the script; 2. Set session variables such as $_SESSION['username']='JohnDoe' on the first page; 3. After calling session_start() on another page, access the variables through the same key name; 4. Make sure that session_start() is called on each page, avoid outputting content in advance, and check that the session storage path on the server is writable; 5. Use ses

See all articles