为什么移动开发人员应该学习PHP?

前言

随着移动端的兴起,越来越多的开发人员投身到移动端的开发热潮当中。虽然移动端开发不可避免的要跟后端打交道,但许多移动端开发人员却对后端开发知之甚少。他们更多的只是专注于自己的领域,对于后端,只要会调用接口、解析接口数据就万事大吉了。多数情况下,这确实已经足够了,那么,为什么要学习后端开发呢?

为什么要学习后端开发?

  1. 能更深刻的了解接口

    • 为什么有的接口要用GET,有的要用POST
    • Restful API的优缺点
    • 如何设计接口对移动端更友好
  2. 接口对接更加得心应手

    • 如果后端要求使用JSON格式传递数据,能够轻易搞定
    • 有助于接口相关问题的排查。我曾经遇到过一个问题,有一个iOS组员,需要做一个拍照将图片上传到后端的功能,这个功能看起来很普通寻常,却把他卡住了。后端开发人员一直说,他那边没有接收到图片,iOS组员弄来弄去都不行,他们两边也都不知道问题出在哪里。后端开发人员甚至把接收文件的代码都贴出来了,显然也是无济于事。后面我去看他们的问题,才发现,iOS组员使用的AFNetworking的API没有错,数据也传对了,错误的地方在于他对文件字段的理解是有问题的。如果做过后端开发,就会知道,在接收文件时,会有一个文件内容字段,还有文件类型(MIME)、文件名等信息,其中文件内容字段名称是后端规定的,上传文件时,只能照搬不误。而对于文件名等信息,则可以自行灵活填写,通常后端也不会使用这些信息(客户端提交的信息是不可信的)。那位iOS组员就是没搞明白这些字段信息的用途和区别,没有填写正确的文件内容字段名称,导致图片是文传上去了,但因为字段名称不相符合,后端无法读取到这个图片内容。
  3. 能更好的实现和H5页面的交互
    APP或多或少都会嵌入一些H5页面,时常需要和H5页面进行交互,这就需要用到html、javascript等Web相关的知识技术,这些技术可以从后端开发中去学习。
    BTW:现在开发的分工已经越来越细,像html、javascript、css这类知识已经被归入前端的范畴,因此也有了前端工程师这样一个专门的职位。随着前端开发方式的演变(如SPA),有些开发已经采用了真正的前后端分离。从这个意义上来说,后端更多的是负责业务逻辑、数据存储、系统架构层面的东西,除了后台管理系统外,已经不涉及页面的部分,但不管如何,html、javascript、css相关的基础知识仍然是后端开发必须学习的。

  4. 可以编写后端代码来辅助APP开发

    • APP一些组件或功能页面的开发,需要看各种数据情况下的表现,比如分页,要看没数据时、只有一页数据时、有多页数据时会怎么样
    • 需要测试某些功能,比如对后端接口发出请求后,请求还未完成,这时取消请求会发生什么
    • 当后端响应缓慢时,APP端会有什么效果?是否会使APP出现一些异常的行为?

    虽然这些可以通过Mock或其他手段或多或少的来达到目的,但能自己写些简单的后端代码来模拟支持,毫无疑问会更加灵活强大

  5. 能够和后端开发PK
    虽然说开发人员何苦为难开发人员,但有时难免会遇到后端开发像“大爷”一样,犯懒、摆架子、不配合的情况,如果你了解后端开发,那么就会有和其PK的资本。甚至如果你学得更深入一些,还能够判断出后端的问题。试想一下,这时你站在后端开发面前说出如同Linus大神的话:show me the code,然后指出他code中的问题,并给他解决方法。他一定会像不明觉厉的吃瓜群众一样,对你惊为天人,顶礼膜拜,从此你在他心目中的形象就是光芒万丈,无法直视,否则会亮瞎钛合金狗眼,会导致内分沁失调,大小便失禁……

  6. 更多的机会,更全面的发展

    • 更高的薪资,更好的发展前景。艺多不压身,更多的技能总会有更好的机会,有些招聘就要求移动端开发人员要熟悉甚至掌握至少一门后端开发语言
    • 更广博、更精深的知识。诸如设计模式、架构这类东西后端用的更多,相关的资料也更多更深,毕竟在移动端火起来之前,后端已经蓬勃发展了很多年,这些通用的知识点能更好地从后端开发中学习

为什么选择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,专门用于将换行符转换成<br />标签
    Java是通用语言,Web开发只是其中一种应用,由Servlet技术规范来处理
    PHP由于专注Web领域,使其在Web领域获得了巨大的成功。但同时,也使其在其他领域几乎毫无建树,所以,通常你不会看到PHP在Web领域之外的应用

  • PHP简洁易用
    Java比较繁琐,学习曲线比较长

以下是用两种语言输出当前日期,可以对比,看出一些端倪
PHP代码:

<?php
echo '<h1>当前日期:'.date('Y-m-d H:i:s').'</h1>';

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("<h1>当前日期:" + (new Date()) + "</h1>");
    }
}

可以看到,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),需要配置映射
<servlet>
    <servlet-name>BookListServlet</servlet-name>
    <servlet-class>javademo.BookListServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>BookListServlet</servlet-name>
    <url-pattern>/book</url-pattern>
</servlet-mapping>

以上是配置/book这个url由javademo.BookListServlet这个Servlet类来处理

运行方式

  • PHP每次访问页面,资源都重新加载,页面访问完成后,资源自动释放,这也是PHP不需要在代码中显式释放资源的原因
  • Java的Servlet相当于单例,只要服务器不重启,每个Servlet都只会有一个实例。其他资源(如数据库连接)需要自行管理,如果不及时释放关闭资源,可能导致系统资源耗尽出错
  • 两种方式各有优缺点,PHP的方式使得代码编写较为简单,开发人员不需要关心资源的释放关闭,但每次访问页面都要重新加载资源,会导致性能损耗。而Java在写代码时,要更加细心,要注意资源的管理,但同时也可以利用Servlet的特点,创建一些全局共享对象,如连接池,从而使应用运行过程中,不需要重复创建销毁对象,节省开销,提高性能,是一种空间换时间的做法

可以看一下两者读取数据库数据的代码:

PHP代码:

<?php
$mysqli = new mysqli('localhost', 'root', '', 'test');
$resultPicks = $mysqli->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<Book> 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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 转自陈明乾的博客,可能有一定更新。 转原文声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、...
    C86guli阅读 4,665评论 6 72
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 使用范围 Skeleton Screen适用于布局排版固定的内容区域,例如列表、文章、个人信息。 展示效果 展示代码
    Nic_ofh阅读 3,496评论 0 0
  • 刘备称帝 刘备得了汉中,天下已然形成三分天下的局势。 220年,曹丕称帝后,蜀中传闻汉献帝刘协已被曹丕杀害,身为汉...
    智御阅读 272评论 0 2