看板 PHP 關於我們 聯絡資訊
※ 引述《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://www.ptt.cc/bbs/PHP/M.1522560734.A.91E.html
nacoyow: 推一個! 04/01 21:41
carrielis: 大推思維! 04/02 06:40
gname: 第2種方法的另一個好處是出問題是死一支,不是死一片 04/02 09:37
kyowinner: 大感謝 好好研究學習一下 04/04 12:39
JohnRoyer: 大大什麼時候要寫 framework? XD 04/06 12:51
GALINE: 是有自己做輪子來玩沒錯啊... https://goo.gl/UnvfTc 04/07 21:12
※ 編輯: GALINE (111.254.16.152), 05/21/2018 02:17:52