PHP 板


LINE

看板 PHP  RSS
※ 引述《kyowinner (mars)》之銘言: : 各位好 想問一個好像有點蠢的問題 : 也是突然想到的,不知道跟執行效率有沒有什麼關係 : 就是在一個專案裡各位會大概怎麼安排檔案/程式架構 : 問題如下 : 1. 所有程式碼在同一個檔案下 ex:index.php : index.php 用if 或是任何方式去判斷要執行的功能 : if(新增A頁面資料){ : }elseif(刪除A頁面資料){ : }elseif(.....)} : } : 諸如此類 以這年頭的 MVC framework 來考量,這是半個「正確」答案了 這樣的好處是你可以把全專案共通邏輯放在同一個地方 甚至連 render 畫面的邏輯都放在同一個地方 然而不共通邏輯也放在同一個地方會很難改 所以最好是把不共通邏輯拆出去 於是就會變成 index.php // 載入共通功能 include __DIR__ . '/lib/lib.php'; // 用路徑跟 http method 決定要做什麼 // $action 是檔名 $method = $_SERVER['REQUEST_METHOD']; $uri = rawurldecode($_SERVER['REQUEST_URI']); $action = checkAction($url, $method); // 執行功能,得到結果 $logicFile = __DIR__ . "/action/{$action}.php"; $result = include $logicFile; // 印出結果畫面 render($action, $result); 雖然很土炮,但是 MVC framework 的樣子已經出來了 checkAction() 是 Router /action 資料夾裡面的東西是 Controller render() 處理 View Model 在哪裡?在 controller 的邏輯裡面 系統核心主幹裡面原則上不該有 這是完全不使用 OOP 跟 Class autoloading 的前世代寫法 基本上一路 include 是能夠打天下,但系統要變大後問題還滿多的 可以參照 #1NHddLlC (Soft_Job) 用 OOP 的寫法大概會是這樣 // 載入 autoloader include __DIR__ . '/vendor/autoload.php'; // 用路徑跟 http method 決定要做什麼 // $action 是 class name,例如 "\My\Controller\Article" $method = $_SERVER['REQUEST_METHOD']; $uri = rawurldecode($_SERVER['REQUEST_URI']); $action = (new \My\Router())->route($url, $method); $controller = (new $action()); // 執行功能,得到結果 $result = $controller->run(); // 印出結果畫面 $template = $controller->getTempate(); (new \My\View)->render($template, $result); 各 Framework 其實差不多就是這樣做出來的。 當然啦,比起各知名 framework 這依然相當土炮。 不過這樣的架構已經可以讓你用很久了 自己刻 framework 沒那麼難的啦(大拇指 : 2.各頁面相對應各自的程式檔 : A.html --> A.php : B.html --> B.php 這種做法跟上面比起來,其實是把 router 交給 http 伺服器來做 理論效能會比自己做 routing 更快一點,而且業務邏輯都拆開到不同的地方,不會混在一起 缺點是,如果你有共通邏輯要用,那這種寫法大概就會讓你得要每隻程式都寫成這樣 <?php include __DIR__ . '/start.php'; /** 中略業務邏輯 **/ include __DIR__ . '/end.php'; 如果每隻程式裡面得像念經一樣複製貼上相同的 code ,通常是某種壞味道。 - 如果有 40 個頁面,要把 start.php 跟 end.php 改位置的話你得改40次 - 如果 40 頁裡面只有二十頁要套用同樣的邏輯,你又得複製二十次另外一行 code - 或者是,你會在 start.php 裡面寫出類似 router 的 code 來判斷該不該做 : 不知道哪個方式在系統以及程式維護上的效率會比較好? 除非你手上的系統一天 PV 十萬,不然不需要擔心 PHP 效能,吃不滿的 一秒戳兩下就感覺慢的話,問題通常會在其他地方 例如SQL有問題,或機器被埋挖礦程式,或機器年紀大到該上小學了 如果還是擔心效能,先升級到 PHP7,效能直接加倍甚至是三倍 升級後還是感覺慢,或是你真的升不上 PHP7 的話,再來看碰到的問題是什麼 讓程式好維護的基本招術倒是跟收東西很像: 分門別類,把有關的東西放一起,無關的東西分開放 如果同樣的東西每個地方都有,那應該是有什麼方法可以整理成一份 關聯很強的邏輯,塞在同一個 class 裡面 有些關聯但是可以分開看的邏輯,放在同一個 namespace 的不同 class 裡面 一點鬼蛋關係都沒有的邏輯,放到其他的 namespace 裡面 「把一起用的東西打包成一包,其他無關的東西扔到其他地方我現在不想看」 物件導向的大道理很多,但基本核心可以用這句話解釋 有趣的是,如果認真的想把程式碼分門別類整齊收好 幫 class 或 function 取名字有時比寫 code 本身還難 -- 不可以!那是黑鷹族的精神象徵! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.138.203.167
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PHP/M.1522560734.A.91E.html
1F:推 nacoyow: 推一個! 04/01 21:41
2F:推 carrielis: 大推思維! 04/02 06:40
3F:→ gname: 第2種方法的另一個好處是出問題是死一支,不是死一片 04/02 09:37
4F:推 kyowinner: 大感謝 好好研究學習一下 04/04 12:39
5F:推 JohnRoyer: 大大什麼時候要寫 framework? XD 04/06 12:51
6F:→ GALINE: 是有自己做輪子來玩沒錯啊... https://goo.gl/UnvfTc 04/07 21:12
※ 編輯: GALINE (111.254.16.152), 05/21/2018 02:17:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP