php 工程化
现在Web开发越来越简单,离不开后端脚本的作用,之所以叫做脚本语言,是因为其解决的问题一般比较小,性能比较低,做不了计算量大或者逻辑很复杂的任务,
但是随着互联网产业的发展,脚本语言越来越多的承担了复杂的计算和逻辑任务,比如批量访问数据库,操作返回记录等,随着这些需求的越发强烈,
脚本语言也支持了面向对象编程,模块化等技术,性能大幅提升(如近来的PHP7),来处理日发复杂的后端业务。
因此我们处理脚本编程也要注意工程化实践的运用,比如使用类来解耦复杂的对象关系,使用路由来转发请求等。工程规模变大后,使用MVC模式是一种非常好的选择,
M表示Model,主要处理与数据库相关的操作,维护一个持久的数据库操作层;V表示View,处理页面显示的问题;C表示Controller,处理逻辑计算任务和返回的数据库记录的整理等操作,并暴露后端服务的接口。这样做之后可以很好的解耦数据库操作,当数据库有改变时,我们可以只是改变M层,不会影响到C层暴露的接口。
实际中该怎么对成长中的项目逐步改进?
很糟糕的一段代码:
<?php /** * Description: 不好的实践 */ $name = isset($_GET["name"]) ? $_GET["name"] : ""; $age = isset($_GET["age"]) ? $_GET["age"] : 18; $conn = new mysqli("127.0.0.1", "root", "user_name", "db_name", 3306); if($conn->connect_errno){ die("连接到数据库失败!"); } $conn->set_charset("utf8"); $sql = "INSERT INTO table_name (name, age) VALUES ('$name', $age)"; $results = $conn->query($sql); while($row = $results->fetch_array()){ // Do something } $conn->close();
数据 逻辑 耦合性太高了!
路由的接收和分发:
首先我们可以提取用户的请求URL中的信息,来决定用户的请求内容,调用相应的功能,这就是简单的路由思想。实现可以利用`$_SERVER`、`$_GET`和`$_POST`超全局数组,获取用户请求的URL和参数,推断用户的操作。例如:用户访问 `https://www.sample.com/getUser/1`,获取getUser和1,我们可以推断用户想获取ID为1的用户信息。
利用以上的技术,我们可以实现简单的路由,并可以讲逻辑处理解耦到其他的地方专门实现。
控制器逻辑处理:
经过以上路由的实现,我们便可以将数据库查询操作和逻辑处理操作移动到一个新的文件,将逻辑操作归类,比如对用户的操作,增加、编辑和删除用户信息,写成一个类;对其他信息的管理写成一个类。这样每个类管理一类信息的维护和管理,且日后修改也可以只修改相应类的实现,其他的地方不必更改。如:
class UserModel{ public function select(){ } public function insert(){ } public function update(){ } public function delete(){ } }
数据库:
将对数据操作的功能抽离出来,放到其他文件,最好将每个表对应一个数据库操作类,因为数据库设计时“每个表只管理一类事物的相关属性”的思想与我们的解耦思想是一致的。将对一类事物的增删改查集合到一个类中,这样,如果数据表结构发生改变,只需关注数据库操作类即可。更进一步,我们可以隔离数据库的改变,如从MySQL更换到PostgreSQL,使用PDO可以隔离数据库类型的改变,不知道的可以查看PHP的文档: http://php.NET/manual/en/intro.pdo.php 。如下是用户模型层(M):
class UserModel{ public function select(){ } public function insert(){ } public function update(){ } public function delete(){ } }
工程化和解耦: 分层 单一化功能
- Route 路由的接收分发
- Controller ... 控制逻辑处理
- Model ... 对表的增删改查
PHP框架学习方法
就在几年前,PHP在后端的工程化框架的缺失令很多人诟病,现在有很多框架可供选择,对于框架,我觉得使用框架可以加快项目开发速度,提高项目质量,便于团队合作。但是比较忌讳使用但是不知道其抽象和分层思想,文章中讲的只是一小部分,更多的需要在实际项目中体会,或者研究框架的设计思想。
比如很火的Laravel,其体现了MVC的设计思想,并实现了路由、数据模型,集成了前端模板引擎blade等等特点都凸显了如何做才能在工程项目中增加系统的健壮性、可维护性和团队协作。在工程项目中可以使用,但是一定要深挖其思想,理解其为什么这么做,这样,才能有所进步,在感觉框架不适合项目时,对其进行扩展或者改进,更进一步,提出并实现自己的框架。
工程化措施本质上就是为了当数据、逻辑或者需求发生改变时,做到系统的一致性和可维护性,再有就是团队分工的需要,大的项目可能每一层都需要专门的人负责。
当你感觉在需求不断改变,实现不断迭代的项目中备受折磨时,你就要想办法进行抽象,解耦等相关措施,或者直接使用框架吧。
工程化的思想是从现实生活中得到的启发,我们要多多感悟生活,感悟大自然中潜在的思想和运行模式,放到编程中实践中,就可以做出很好的东西,当然要注意先打好基础,然后接触项目,感悟,最后提高自己。
其实,这正是编程学习的三个阶段,
- 学编程语言的基础,控制流程,面向对象编程;
- 然后项目中锻炼,体验工程化思想;
- 最后当你遇到别人没有遇到的问题并解决不了时,或者系统性能出现瓶颈时,你会回到基础,看看实现原理是什么,使用什么 算法与数据结构会 解决问题或者提高效率。
算法与数据结构知识库
http://lib.csdn.net/base/datastructure