首页 > 编程 > PHP > 正文

记第二次使用php开发项目之绝不重复自己

2020-03-22 16:55:07
字体:
来源:转载
供稿:网友
  • 严格说起来,自己并非一个合格的php程序员。第一次使用php开发,不过是因为游戏上线,需要一个统计管理后台和GM后台,因为招聘已经来不及,所以我就上前线了!

    凭着对php语法的一点点记忆(大学的时候学习过),边看《php与Mysql Web开发》,就边上手了!刚开始写的时候,根本没有章法,html 和 php直接混在一起,后来边开发边琢磨,不能这样,起码要界面和逻辑分离一下吧。想起来大学的时候做过ASP.NET,使用了自己理解的三层构架,那么就把三层构架引入吧。可是实际的开发过程中,觉得中间逻辑层和数据层实在不想费脑筋分开,就索性用两层好了,于是就调整成了两层构架。

      比如我们举一个例子:我们要做一下金币消耗的统计。

    首先看下 coinsCustomView.php:

    <table>	<tr>		<th>类型</th>		<th>数值</th>	</tr>	<?php 		require_once('dataStaticsLogic.php');		$arr = array();		$arr = getCoinStatics();		foreach($arr as $key=>$value)		{	?>	<tr>		<td><?php echo $value["type"]; ?></td>		<td><?php echo $value["content"]; ?></td>	</tr>	<?php 		}	?></table>

    再看下 dataStaticsLogic.php的定义:

    <?php	require_once ('../../include/common.inc.php');	require_once('../../include/biz/order.php');	require_once ('../comm/safety.php');	require_once ('../serialsModule/serialsMuduleBase.php');	//金币统计	function getCoinStatics()	{		global $mongoUrl;		global $moneyConfig;		global $mongoName;		$mongoConn = new Mongoclient($mongoUrl);		$mongoDB = $mongoConn->selectDB($mongoName);		$mongoCollection = $mongoDB->selectCollection("mmo.moneySerials");				$statics = array();		foreach ($moneyConfig as $key=>$value)		{						$query = array('type'=>$key);			$itemSum = 0;			$cursor = $mongoCollection->find($query);			while($cursor->hasNext())			{				$row = $cursor->getNext();				$itemSum += $row['value'];			}						$item["type"] = $value;			$item["content"] = $itemSum;						$statics[] = $item;		}		$mongoConn->close();		return $statics;	}

      ***View.php 是用来展现数据的代码,而***Logic.php是用来处理逻辑和获取数据的代码。就是套用这样一个简单的逻辑,基本是面向对象的思想(项目中基本没有使用php面向对象的思想),完成了第一个php统计后台和GM管理后台!我只能可能要被php大神耻笑了。大家还是体谅一下一个java程序写php的苦衷吧!

    很多,我们迎来了第二个项目,第二个项目也需要一个统计后台。当开始着手做这个php统计后台的时候,我自己心中有两个声音一直在提醒我。一个是,把原来的项目拔拔,再改吧改吧,继续套用好了,反正上次也没有出现什么问题。第二个声音就是,专业一点,不要重复自己,使用现在流行的mvc模式,去做这个新的后台,这样也能完成自己对php的新的认知。很多朋友来提来意见,有的说,代码技术只是工具啦,做出来能用就好,而且还是一个内部使用工具,做那么专业干嘛,简单高效是准则! 有的说,直接套用php成熟的框架smarty或者 thinkphp啦。根本不用想太多!

    最终最终还是,奔着绝不重复自己的原则,决定使用mvc模式,把数据,逻辑和界面分开!也趁机好好学习了一下mvc模式,因为毕业以来一直在做服务器的开发,所以对前段这些框架,虽然他们天天讲,可是自己始终不太理解。好吧,趁这次机会,提升自己一下啦。

    那么我们就拿一个简单的例子来做参考,来理解一下mvc模式,顺便看看新的项目,是如何做模块的划分的,如何分离界面,数据和逻辑的!

    首先给我们看下图:

    qqGjudjT2k1WQ7XEyr7S4s28o6zN+MnPysfU2srHzKu24MHLo6zO0r7NsrvU2tXiwO/M+bP2wLTBy6OstPO80svmsePL0cvRo6y087DRtcTNvMaswP3X07rNzsS1taGjPC9wPgo8cD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgztLDx9PD0ru49rvxyKHL+dPQt7+85MHQse21xMD919PAtNf2ss6/vLrDwcujoTwvcD4KPHA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IMrXz8i/tM/CTW9kZWyy46Osvs3Kx8v5zr3Stc7xsuOjrLD8uqxSb29twOC1xMnovMajrLu509DQ6NKqy7XD97XEysejrEN1cmxSZXF1ZXN0wOCjrNXiwO++zbK7zPmz9sC0wcujrL7NysdodHRwx+vH87vxyKHK/b7do6zU2tXiwO/P4L3P09rHsNK7uPbP7sS/o6y63LbgtqvO97a8yse34tews8nBy8Dgo6HO3sLbysdodHRwx+vH86Osu7nKx8r9vt2/4sfrx/OjoTwvcD4KCjxwcmUgY2xhc3M9"brush:php;collapse:true;;gutter:true;">class Room { private $roomId; private $roomName; private $roomUserCnt; private $roomSpectCnt; public function __construct($roomId,$roomName,$roomUserCnt,$roomSpectCnt) { $this->roomId = $roomId; $this->roomName = $roomName; $this->roomUserCnt = $roomUserCnt; $this->roomSpectCnt = $roomSpectCnt; } public function getRoomId(){ return $this->roomId; } public function getRoomName(){ return $this->roomName; } public function getRoomUserCnt(){ return $this->roomUserCnt; } public function getRoomSpectCnt(){ return $this->roomSpectCnt; } }class RoomModel { private $cmd = "php"; private $subCmd = "roomList"; public function fetchAllRooms(){ require_once dirname( dirname( dirname(__FILE__) ) ).'/base/CurlRequest.class.php'; require_once 'Room.class.php'; $allRoom = array(); $curl = new CurlRequest(); $result = $curl->fetchResponse($this->cmd, $this->subCmd); $resultByJson = json_decode($result,true); for($i = 0;$i<count($resultByJson);$i++){ $allRoom[] = new Room($resultByJson[$i]["roomId"], $resultByJson[$i]["roomName"], $resultByJson[$i]["roomUserCnt"], $resultByJson[$i]["roomSpectCnt"]); } return $allRoom; } }

    RoomModel的职责很简单,就是获得所有的房间数据,无论是通过Http请求获得,还是通过Mysql数据库获得,界面和逻辑层都无从得知。

    下面是界面层:也就是RoomView.php的代码

    <?php                        	echo "<table>";	echo "<tr><th>房间id</th><th>房间名称</th><th>参与人数</th><th>旁观人数</th></tr> ";		foreach ($allRoom as $room)	{	   echo "<tr>";	   echo "<td>".$room->getRoomId()."</td>";	   echo "<td>".$room->getRoomName()."</td>";	   echo "<td>".$room->getRoomUserCnt()."</td>";	   echo "<td>".$room->getRoomSpectCnt()."</td>";	   echo "</tr>";	}		echo "</table>"?>

      View在这里,就是控制界面,输出所要展现的数据。

    很多人可能就想,有View和Model在这里,完全不需要Controller了吧,起始我觉得也是这样

    下面看下RoomListController的代码

    <?php class RoomListController {    public function displayRoomList(){        require_once (dirname(dirname(__FILE__))."/model/RoomModel.class.php");                $roomModel = new RoomModel();        $allRoom = $roomModel->fetchAllRooms();                include_once dirname(dirname(__FILE__))."/view/RoomListView.php";            }}    $roomController = new RoomListController();    $roomController->displayRoomList();    ?>

      Controller层,起始就是控制界面的输出的,属于Model和View两层之间的桥接。在这里提下我所理解的三层构架和MVC模式的区别---也许并不成熟,那就权当抛砖引玉好了,三层构架可以理解为VCM,即V冲在最前面,M起始就是用来采集数据或者更新数据,C呢,起到了桥接M和V的作用。而MVC,则是C冲在最前面,界面的展现与否,也要C来控制,当然也是桥接MV。

    按照这样一个设计,前几个模块,都是这样套用mvc模式来做的,有了这样一个划分,代码整体看起来还是整洁了很多,规范了很多!就在游戏后端的开发中,我们基本上都会定义这样一个规范,以便于出了问题bug,能很快定位,那块出了问题。

    写在最后

    也许我对MVC的理解,还是不够准确,也许我对于php的开发,还是很菜鸟级别。但是由菜鸟向大神,由普通向高级的过程中,不重复自己,会让我走的更快。

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表