作者GALINE (天真可愛CQD)
看板PHP
標題Re: [請益] 程式/檔案架構的問題
時間Sun Apr 1 13:32:09 2018
※ 引述《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
※ 編輯: GALINE (111.254.16.152), 05/21/2018 02:17:52