前言
随着移动端的兴起,越来越多的开发人员投身到移动端的开发热潮当中。虽然移动端开发不可避免的要跟后端打交道,但许多移动端开发人员却对后端开发知之甚少。他们更多的只是专注于自己的领域,对于后端,只要会调用接口、解析接口数据就万事大吉了。多数情况下,这确实已经足够了,那么,为什么要学习后端开发呢?
为什么要学习后端开发?
-
能更深刻的了解接口
- 为什么有的接口要用GET,有的要用POST
- Restful API的优缺点
- 如何设计接口对移动端更友好
-
接口对接更加得心应手
- 如果后端要求使用JSON格式传递数据,能够轻易搞定
- 有助于接口相关问题的排查。我曾经遇到过一个问题,有一个iOS组员,需要做一个拍照将图片上传到后端的功能,这个功能看起来很普通寻常,却把他卡住了。后端开发人员一直说,他那边没有接收到图片,iOS组员弄来弄去都不行,他们两边也都不知道问题出在哪里。后端开发人员甚至把接收文件的代码都贴出来了,显然也是无济于事。后面我去看他们的问题,才发现,iOS组员使用的AFNetworking的API没有错,数据也传对了,错误的地方在于他对文件字段的理解是有问题的。如果做过后端开发,就会知道,在接收文件时,会有一个文件内容字段,还有文件类型(MIME)、文件名等信息,其中文件内容字段名称是后端规定的,上传文件时,只能照搬不误。而对于文件名等信息,则可以自行灵活填写,通常后端也不会使用这些信息(客户端提交的信息是不可信的)。那位iOS组员就是没搞明白这些字段信息的用途和区别,没有填写正确的文件内容字段名称,导致图片是文传上去了,但因为字段名称不相符合,后端无法读取到这个图片内容。
能更好的实现和H5页面的交互
APP或多或少都会嵌入一些H5页面,时常需要和H5页面进行交互,这就需要用到html、javascript等Web相关的知识技术,这些技术可以从后端开发中去学习。
BTW:现在开发的分工已经越来越细,像html、javascript、css这类知识已经被归入前端的范畴,因此也有了前端工程师这样一个专门的职位。随着前端开发方式的演变(如SPA),有些开发已经采用了真正的前后端分离。从这个意义上来说,后端更多的是负责业务逻辑、数据存储、系统架构层面的东西,除了后台管理系统外,已经不涉及页面的部分,但不管如何,html、javascript、css相关的基础知识仍然是后端开发必须学习的。-
可以编写后端代码来辅助APP开发
- APP一些组件或功能页面的开发,需要看各种数据情况下的表现,比如分页,要看没数据时、只有一页数据时、有多页数据时会怎么样
- 需要测试某些功能,比如对后端接口发出请求后,请求还未完成,这时取消请求会发生什么
- 当后端响应缓慢时,APP端会有什么效果?是否会使APP出现一些异常的行为?
虽然这些可以通过Mock或其他手段或多或少的来达到目的,但能自己写些简单的后端代码来模拟支持,毫无疑问会更加灵活强大
能够和后端开发PK
虽然说开发人员何苦为难开发人员,但有时难免会遇到后端开发像“大爷”一样,犯懒、摆架子、不配合的情况,如果你了解后端开发,那么就会有和其PK的资本。甚至如果你学得更深入一些,还能够判断出后端的问题。试想一下,这时你站在后端开发面前说出如同Linus大神的话:show me the code,然后指出他code中的问题,并给他解决方法。他一定会像不明觉厉的吃瓜群众一样,对你惊为天人,顶礼膜拜,从此你在他心目中的形象就是光芒万丈,无法直视,否则会亮瞎钛合金狗眼,会导致内分沁失调,大小便失禁……-
更多的机会,更全面的发展
- 更高的薪资,更好的发展前景。艺多不压身,更多的技能总会有更好的机会,有些招聘就要求移动端开发人员要熟悉甚至掌握至少一门后端开发语言
- 更广博、更精深的知识。诸如设计模式、架构这类东西后端用的更多,相关的资料也更多更深,毕竟在移动端火起来之前,后端已经蓬勃发展了很多年,这些通用的知识点能更好地从后端开发中学习
为什么选择PHP?
诚然,在后端开发中,有很多语言可以选择,比如Ruby(Rails)、Node.js、Python、.Net、Java、PHP,那么为什么要选择PHP呢?
Ruby(Rails)、Node.js属于较为新兴的群体,特别是Node.js,09年才发布,相对而言都比较小众。
.Net有不少使用群体,但主要针对Win平台,对于做iOS开发的人来说,环境是个问题(没有了解过Mac下能否进行.Net开发,即使能,估计也会比较麻烦)。
剩下的几个,Python虽然出道早,在后端开发中也有一席之地。但在国内的大环境下,用来做后端开发的还是Java和PHP占大头,相信移动开发人员所遇到的后端系统,大部分都是这两种语言开发的。
接下来,我将比较PHP和Java各自的特点,以便让大家对为何要选择PHP有一个更清楚的认识。
注意,本文不是教学类的文章,如果你想学习PHP或Java Web开发,想学习html、javascript、css方面的知识,请自行搜索,网上有许多相关的教程
语言特点
PHP面向过程、面向对象兼而有之
Java纯面向对象PHP专为Web而生,对Web开发的支持非常好,甚至一个非常简单的功能都有专门的函数,如
nl2br
,专门用于将换行符转换成
标签
Java是通用语言,Web开发只是其中一种应用,由Servlet技术规范来处理
PHP由于专注Web领域,使其在Web领域获得了巨大的成功。但同时,也使其在其他领域几乎毫无建树,所以,通常你不会看到PHP在Web领域之外的应用PHP简洁易用
Java比较繁琐,学习曲线比较长
以下是用两种语言输出当前日期,可以对比,看出一些端倪
PHP代码:
当前日期:'.date('Y-m-d H:i:s').'';
Java代码:
import javax.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
public class FirstServlet extends HttpServlet {
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.write("当前日期:" + (new Date()) + "
");
}
}
可以看到,Java代码比较冗长,必须定义一个Servlet
类,在对应的方法中去输出日期。而PHP则简洁许多,可以使用过程式写法,不用定义类,即可直接输出信息。
环境配置
- PHP环境配置十分简单,Mac下现成,Linux有的也自带。PHP从5.3开始,自带一个Web服务器,可以用PHP命令行
php -S 0.0.0.0:端口号 -t 目录
直接启动服务器,立即开始开发(具体可以参考:极速配置PHP环境) - Java环境通常是非自带,需要自行安装JDK,自行下载安装Tomcat或其他服务器
- 如果系统没有自带PHP环境,PHP和Java的环境配置个人感觉算是半斤八两,Java如果用手工的方式来做会麻烦一些,但使用专门的IDE可以大大简化这些工作
IDE
- 由于PHP代码简洁、开发简单,不需要专门的IDE,用普通的文本编辑器,或者稍微好点的编辑器,如Sublime,就可以进行开发。如果要使用IDE,也有诸如PHPStorm、Zend Studio这样的专业工具
- Java代码比较繁琐,且Web开发还涉及到编译打包服务器部署,通常需要专门的IDE,否则会比较费劲。当然,支持Java的IDE,如Eclipse、IntelliJ IDEA都非常不错
编译
PHP是解释型,不需要编译,修改完代码后,直接访问即可生效,很适合快速开发
Java是编译型的语言,即使是一行代码的修改,也需要编译打包部署到服务器(通常还需要重启服务器),才能生效
Java的jsp文件虽然可以直接部署到服务器中,但其实是服务端帮你自动进行编译(这也是jsp页面第一次被访问时会比较慢的原因)。其次,jsp文件通常只是充当View的角色,不会将逻辑处理等代码放到其中,所以,除非只修改页面的显示,否则大部分情况下修改都需要自行编译打包部署。这点有时很令人厌烦,修改个东西,要等好一会儿才能看到效果,会影响开发效率。但从另一方面来说,这也是一个极好的“偷懒”的借口,你可以等它编译打包部署的时候,悠哉的去泡杯咖啡喝
-
解释型语言有时也会带来一些“副作用”,有些错误要在运行时才能发现,这也会导致代码中一些很低级的错误(比如调用不存在的函数)难以察觉
if (isset($_GET['test'])) { notexistfunction(); }
上面的代码中,
notexistfunction
这个不存在的函数只有在$_GET['test']
有值时才会调用,而其他情况下,会跳过这段代码,这会使得这种低级的错误只在某些情况下才能发现
路由
- PHP写好代码后,直接在浏览器中输入url访问对应的php文件即可
- Java需要在
web.xml
配置映射,虽然jsp文件可以直接访问,但处理逻辑的类(Servlet),需要配置映射
BookListServlet
javademo.BookListServlet
BookListServlet
/book
以上是配置/book
这个url由javademo.BookListServlet
这个Servlet
类来处理
运行方式
- PHP每次访问页面,资源都重新加载,页面访问完成后,资源自动释放,这也是PHP不需要在代码中显式释放资源的原因
- Java的Servlet相当于单例,只要服务器不重启,每个Servlet都只会有一个实例。其他资源(如数据库连接)需要自行管理,如果不及时释放关闭资源,可能导致系统资源耗尽出错
- 两种方式各有优缺点,PHP的方式使得代码编写较为简单,开发人员不需要关心资源的释放关闭,但每次访问页面都要重新加载资源,会导致性能损耗。而Java在写代码时,要更加细心,要注意资源的管理,但同时也可以利用Servlet的特点,创建一些全局共享对象,如连接池,从而使应用运行过程中,不需要重复创建销毁对象,节省开销,提高性能,是一种空间换时间的做法
可以看一下两者读取数据库数据的代码:
PHP代码:
query('SELECT * FROM t_book');
$books = [];
while ($picksRow = $resultPicks->fetch_array(MYSQLI_ASSOC)) {
$books[] = $picksRow;
}
include 'book_list.html';
Java代码:
public class BookListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection connection = null;
List bookList = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=UTF8";
connection = DriverManager.getConnection(url);
Statement stmt = connection.createStatement();
String sql = "SELECT * FROM book";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
bookList.add(new Book(rs.getString("id"), rs.getString("name")));
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
request.setAttribute("bookList", bookList);
request.getRequestDispatcher("book_list.jsp").forward(request, response);
}
}
可以看到,Java代码比较冗长,涉及资源释放、异常处理(Java的声明式异常是必须处理的,要么catch,要么直接在方法上再往外throws)。而PHP则简洁许多,资源会自动释放,可以不写释放资源的代码,也不必一定要处理异常
其他
- PHP是世界上最好的语言,这点是不需要解释的
- Android端的开发人员可能会比较喜欢Java,这可以省去语言学习的负担
结论
总的来说,PHP比较易学易用,对于学习了解后端开发,或快速开发一些简单的后端系统而言,是一个理想的选择。当然,如果你深入学习,PHP也能胜任复杂系统的开发(但这方面不如Java好)。Java而言,就显得比较“重”,不论是语言本身,还是配置运行,都较为复杂,学习曲线比较长、比较陡。如果只是出于学习了解后端开发的目的,Java不是一种高性价比的选择,除非是想转型做后端开发,否则不建议选择Java。