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/cn.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灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP