作者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/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
※ 编辑: GALINE (111.254.16.152), 05/21/2018 02:17:52