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

简介:

      严格说起来,自己并非一个合格的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模式,顺便看看新的项目,是如何做模块的划分的,如何分离界面,数据和逻辑的!

      首先给我们看下图:

     

      首先在代码的组织上,就将业务逻辑和界面分开。关于MVC的示意图,网上是在是太多了,我就不在这里贴出来了,大家随便搜搜,大把的图片例子和文档。

      我们用一个获取所有房间列表的例子来做参考好了!

      首先看下Model层,就是所谓业务层,包含Room类的设计,还有需要说明的是,CurlRequest类,这里就不贴出来了,就是http请求获取数据,在这里相较于前一个项目,很多东西都是封装成了类!无论是http请求,还是数据库请求!


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的开发,还是很菜鸟级别。但是由菜鸟向大神,由普通向高级的过程中,不重复自己,会让我走的更快。


相关文章
ly~
|
3月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
81 6
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
62 4
|
4月前
|
缓存 前端开发 API
PHP 适合做什么类型的项目
【8月更文挑战第4天】PHP 适合做什么类型的项目
66 4
|
20天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
随着互联网技术的发展,前后端分离成为Web开发的主流模式。本文介绍RESTful API的基本概念、设计原则及在PHP中的实现方法。RESTful API是一种轻量级、无状态的接口设计风格,通过HTTP方法(GET、POST、PUT、DELETE)操作资源,使用JSON或XML格式传输数据。在PHP中,通过定义路由、创建控制器、处理HTTP请求和响应等步骤实现RESTful API,并强调了安全性的重要性。
23 2
|
24天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
2月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
3月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
2月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
47 3
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
3月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
39 5