PHP面向?qū)ο笾乙?jiàn)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
PHP由Sapi、Main、Zend和Ext組成,PHP應(yīng)用由哪些組成?地基+上層建筑。所謂地基就是各個(gè)應(yīng)用間共有的那些部分,像現(xiàn)在流行的很多PHP框架就是試圖給你打個(gè)地基。我不大喜歡別人給我打地基,所以平時(shí)都是自己打地基,自己打的地基牢與不牢自己最清楚。我爸是個(gè)建筑家,他建房子的能力在我們小鎮(zhèn)也是赫赫有名了,從小耳濡目染,導(dǎo)致我也對(duì)打地基搞建筑很感興趣,現(xiàn)在把這股勁弄到打軟件地基上來(lái),看能打出個(gè)啥地基出來(lái),嘿嘿。 本文摘自《草根》雜志第三期 -- http://www.lampbrother.net/grassroots/ 這個(gè)地基應(yīng)該怎么打?說(shuō)實(shí)話這非常依賴經(jīng)驗(yàn)。純理論派的家伙,別看他口若懸河講起理論來(lái)滔滔不絕,你一讓他給你寫一個(gè)出來(lái)看看,他立馬消失;純實(shí)戰(zhàn)派的家伙怎么樣,對(duì)比想象一下便知,在此不在廢話。我不喜歡蠻干,所以我推崇的是中庸之道:理論與實(shí)踐相結(jié)合。 看過(guò)一堆框架后相信很多人多少都對(duì)什么控制器、視圖、模型之類的東西有點(diǎn)熟悉了,在此也不多說(shuō)。我想說(shuō)的是,把眼光放遠(yuǎn)一點(diǎn),放靈活一點(diǎn),放實(shí)際一點(diǎn)。又遠(yuǎn)又實(shí)際?這不是矛盾么?那可未必。面向?qū)ο笫遣皇禽^新的開(kāi)發(fā)方式?看著那么多粉絲前撲后繼“奔向”軟件開(kāi)發(fā)的“真理”,我倒開(kāi)始打退堂鼓。當(dāng)然,你可以認(rèn)為我面向?qū)ο竽芰Σ贿^(guò)關(guān):)然而翻開(kāi)《人月神話》,感受一下真正的大師對(duì)面向?qū)ο箝_(kāi)發(fā)方式的淡然的態(tài)度,我忽然覺(jué)得以前對(duì)面向?qū)ο箝_(kāi)發(fā)的狂熱是多么幼稚…… 實(shí)際上我想說(shuō)的是,面向?qū)ο蟛贿^(guò)是一種普通的軟件開(kāi)發(fā)方式,而且它的名字取得很莫名其妙,什么是“面向”對(duì)象?為什么是“面向”而不是“背向”?這很滑稽,所以我寧愿稱之為“對(duì)象化”編程,以跟“結(jié)構(gòu)化”編程相對(duì)應(yīng)。對(duì)象又多少種呢?在PHP里,基礎(chǔ)設(shè)施大部分是地基對(duì)象。注意,我說(shuō)的是“對(duì)象”,而不是“類”。我很反感討論對(duì)象時(shí)把類扯進(jìn)來(lái)。PHP程序的一次運(yùn)行就像一個(gè)士兵到一個(gè)城堡內(nèi)送一封信,得到城主的處理后把結(jié)果送回,從進(jìn)城門到出城門這一過(guò)程就是PHP腳本的執(zhí)行過(guò)程。它的本質(zhì)就是“過(guò)程”,不認(rèn)識(shí)這個(gè)本質(zhì)的設(shè)計(jì)注定是失敗的。這個(gè)過(guò)程你會(huì)怎么設(shè)計(jì)?這就跟打基礎(chǔ)一樣啦。你會(huì)想,可能會(huì)有兩個(gè)士兵守城門,進(jìn)了城門后有向?qū)?,向?qū)?huì)問(wèn)你有什么事,然后告訴你怎么走,走到目的地后又有士兵攔住你要證明,通過(guò)證明后才讓你進(jìn)入辦事處,然后才是實(shí)際的事務(wù),完成事務(wù)后一路返回,向各個(gè)守衛(wèi)告別,最后離開(kāi)城門:整個(gè)過(guò)程就是PHP腳本的執(zhí)行過(guò)程。 發(fā)覺(jué)我經(jīng)常走題萬(wàn)里,看,什么是靈活一點(diǎn)什么是實(shí)際一點(diǎn),怎么打地基,都跑九霄云外去了,抱歉抱歉。實(shí)際上靈活、實(shí)際等概念跟其它眾多優(yōu)秀設(shè)計(jì)理念完全是融合在一起的,不好單獨(dú)抽出來(lái)說(shuō)明而不涉及其它概念,但基于這些互相融合的概念,設(shè)計(jì)出來(lái)的系統(tǒng)卻是非常靈活的系統(tǒng),具有非常低的互相糾纏關(guān)系,用術(shù)語(yǔ)說(shuō),是“耦合”關(guān)系。“零件”是極富表現(xiàn)力的隱喻,一個(gè)系統(tǒng)的動(dòng)作都是由零件組織起來(lái)的。OK,回到城堡的例子,前面說(shuō)的守衛(wèi)啊,向?qū)О【褪歉鞣N各樣的零件。零件需要“類”嗎?直接來(lái)看,不需要,它們各成自的職責(zé),管它什么類不類。當(dāng)你真正需要具有相 同職責(zé)的多個(gè)零件時(shí),你才真正需要類。我認(rèn)為就php的執(zhí)行模式來(lái)看,它應(yīng)該添加一個(gè)編程元素:對(duì)象,然后賦給它各種修飾,如抽象對(duì)象 啦,抽象接口啦,等等。偏偏PHP那班開(kāi)發(fā)人員死腦筋,一味只知道照搬其它語(yǔ)言的概念,對(duì)“建設(shè)有PHP特色的編程模式”沒(méi)有沖勁。 好了,不再瞎扯了:)回到城堡上來(lái)。剛進(jìn)門需要一個(gè)人接待你,不管你要什么,你總是要進(jìn)門的嘛,所以初始檢查就是這個(gè)守衛(wèi)的責(zé)任了,放在PHP里,就是所謂的index.php,所有的請(qǐng)求統(tǒng)一由它來(lái)接收。這個(gè)守衛(wèi)要做些什么,有哪些職責(zé),都需要你這個(gè)設(shè)計(jì)師來(lái)設(shè)計(jì)。如果這個(gè)人不符合進(jìn)門標(biāo)準(zhǔn),那么不好意思,只能請(qǐng)你回去了,呵呵。如果通過(guò)了檢查,守衛(wèi)可能要根據(jù)你的要求來(lái)選擇為你服務(wù)的后續(xù)人員,比如你只認(rèn)識(shí)英文,那我當(dāng)然要給你布置英文環(huán)境了,呵呵。向?qū)в肿鍪裁茨?,它要根?jù)你想去的目的地為你指路,所以它需要知道你的目的地,和一張城堡地圖。如果在城堡地圖里找不到你要去的地方,那么sorry,您來(lái)錯(cuò)地方了,地圖是一件公有物品,因?yàn)槿绻姓l(shuí)要告訴這個(gè)衛(wèi)兵另一個(gè)目的地的話,它都必須是在地圖里明確標(biāo)明的一個(gè)地方。對(duì)比到PHP里,你很容易就能知道這是一個(gè)dispatch+route的過(guò)程,呵呵。所以開(kāi)發(fā)這些名詞的那些家伙也只是借了些隱喻而已,沒(méi)什么大不了的,只要你想象力豐富,你完全可以顛倒這個(gè)一般的城堡規(guī)則,按你的意思來(lái)構(gòu)建屬于你的城堡規(guī)則。 指令操作數(shù)據(jù)這種方式,跟數(shù)據(jù)本身具有綁定的指令這種方式,有什么本質(zhì)的區(qū)別?沒(méi)有質(zhì)的區(qū)別。你可能會(huì)跟我說(shuō)在認(rèn)知上有區(qū)別,對(duì),但這種區(qū)別我認(rèn)為并沒(méi)有想象中的那么大,只是把主動(dòng)權(quán)倒了一下而已,并沒(méi)有多少神奇的能力和效果。面向?qū)ο缶幊虒?shí)在是被吹得太過(guò)了。 不覺(jué)得?再看看《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》里的服務(wù)。你覺(jué)得服務(wù)操作實(shí)體是不是跟指令操作數(shù)據(jù)非常相像?這是一個(gè)非常大的諷刺,面向?qū)ο蟮慕K點(diǎn),卻是它們所不屑的“指令操作數(shù)據(jù)”的編程方式!嗚呼,“面向?qū)ο蠹夹g(shù)并沒(méi)有給我們帶來(lái)‘神奇的效應(yīng)’,不管開(kāi)發(fā)商如何吹噓面向?qū)ο?SPAN>OO(Object-Oriented)工具是多么萬(wàn)能,也不管那些OO狂熱者是多么毅然地前赴后繼,這方面的數(shù)據(jù)從20世紀(jì)80年代以來(lái)并沒(méi)有發(fā)生大的改觀”。 反觀目前的PHP框架,有多少是遵循了軟件設(shè)計(jì)和對(duì)象式編程的精髓呢?很遺憾,沒(méi)有。Zend Framework?不客氣地說(shuō),它連幼兒都算不上,還只是個(gè)嬰兒,而且是個(gè)委員會(huì)產(chǎn)品,跟軟件藝術(shù)相差幾萬(wàn)光年。 我不喜歡在領(lǐng)域?qū)觼y搞對(duì)象,這樣你只會(huì)給自己帶來(lái)麻煩,你很難靈活地把它們保存到數(shù)據(jù)庫(kù)中。雖然我不喜歡過(guò)早優(yōu)化,但即便是不優(yōu)化,對(duì)象映射到關(guān)系也是件很麻煩的事情,如果再需要為了性能進(jìn)行數(shù)據(jù)庫(kù)重構(gòu),引入各種不合關(guān)系數(shù)據(jù)原則的修改,則情況會(huì)更糟。軟件開(kāi)發(fā)的首要使命就是降低復(fù)雜度,對(duì)象關(guān)系映射卻成功地把復(fù)雜度提高到了一個(gè)新的高度。當(dāng)然你熟悉了ORM,小系統(tǒng)開(kāi)發(fā)起來(lái)非???,但不要把這套經(jīng)驗(yàn)照搬到大負(fù)載系統(tǒng)里來(lái),這樣你會(huì)死得很慘。 再看看ROR,它現(xiàn)在已經(jīng)為了迎合所謂的“企業(yè)級(jí)應(yīng)用”而“成功地”變得越來(lái)越復(fù)雜,等著看它被徹底拋棄吧。 該文章在 2012/4/18 22:11:24 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |