V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tanteng
V2EX  ›  PHP

《性感的 PHP——现代化 PHP 开发》PPT 分享

  •  1
     
  •   tanteng · 2016-09-25 22:52:08 +08:00 · 5854 次点击
    这是一个创建于 3014 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (原文链接: https://www.tanteng.me/page/mordern-php

    说好的把这次技术分享的 PPT 发出来的,一直没时间弄,现在整理了一下,并导出了一份 PDF 版的 PPT ,给大家参考。( PS :本次技术分享仅仅是介绍一些关于现代化 PHP 开发的技术,并不是讲某个方面的高深技术和经验,即便如此,针对目前的 PHP 现状,很多项目,公司和开发者,还在使用过时的 PHP 技术,这个分享还是有价值的)。

    本次技术分享主要讲了一些现代化 PHP 开发的技术, PPT 重点介绍了命名空间,闭包,匿名函数, Traits 这些新特性,以及介绍了 Composer 依赖包管理器和 PSR 规范。

    主要内容

    PHP 正在重生。作为一门专注 WEB 开发的语言,它不断吸取其他语言的优点,如命名空间,闭包,性状,操作码缓存等特性, PSR 规范和 Composer 包管理以及 PHP 7 的性能提升, PHP 正在变成一门现代化的语言,让我们一起聊聊 PHP 有哪些新的变化!

    • 命名空间
    • PSR 规范
    • 闭包和匿名函数
    • Trait
    • Composer 包管理器
    • 语法新特性
    • PHP 7 性能
    • Laravel 框架介绍

    全面的 PHP 技术堆栈图

    我们先来回顾一下 WEB 开发所用到的技术和工具,这里的 PHP 可以替换为 Python , Java ,.NET 等其他语言,因为 PHP 只是一门语言,而 WEB 开发的本质是一样的。我们的重点是掌握 PHP 本身,和它密切相关的如 MySQL , Nginx/Apache , Linux ,前端方面至少熟悉 jQuery, css 等,但是当项目规模越来越大,并发量越来越高,我们就要用到 Redis , Memcache 等缓存技术,总之,我们要学的东西越来越多,才能满足高性能的 WEB 开发。这里只是列举了比较常用的技术和工具,欢迎大家进行补充。

    PHP 技术堆栈图

    命名空间

    PHP 一个重要的改变,就是引入了命名空间。命名空间是使 PHP 成为一门现代语言的重要特性,它不仅解决了第三方扩展包的类命名冲突的问题,还提供了良好的代码组织的方式,并且通过它进行自动加载。

    如 PHP 手册里所描述,命名空间好比操作系统中的目录,两个同名的文件可以共存在不同的目录下。同理两个同名的 PHP 类可以在不同的 PHP 命名空间下共存,就这么简单。

    因此把你的代码放在你的命名空间下就非常重要,避免其他开发者担心与第三方类库冲突。

    PSR 规范

    PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。

    PHP FIG , FIG 是 Framework Interoperability Group (框架可互用性小组)的缩写,由几位开源框架的开发者成立于 2009 年,从那开始也选取了很多其他成员进来(包括但不限于 Laravel, Joomla, Drupal, Composer, Phalcon, Slim, Symfony, Zend Framework 等),虽然不是「官方」组织,但也代表了大部分的 PHP 社区。

    项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。 自动加载规范非常重要, PHP 组件都遵循自动加载规范,才能通过 Composer 进行管理。

    Composer 包管理器

    Node.js 有 npm , Python 有 pip ,现在 PHP 有了 Composer , Composer 是 PHP 的一个包( PHP 组件)管理器,这些组件遵循 PSR 规范,因此可以快速应用到你的项目中,而且可以开源共同维护。

    Composer 包管理器

    PHP 组件具备以下特点

    • 作用单一:专注于解决一个问题,而且使用简单的接口封装功能
    • 小型:小巧玲珑,只包含解决某个问题所需的最少代码
    • 合作: PHP 组件之间可以良好合作,组合在一起实现大型项目
    • 测试良好:本身提供测试,而且有充足的测试覆盖度
    • 文档完善:应该提供完善的文档,能让开发者轻易安装、理解和使用

    PHP 新语法

    PHP 5.6 —— PHP 7 提供了很多新的语法和特性,如闭包和匿名函数, Traits ,运算符简写方式,数组简写方式,类型约束等等。

    学习现代化 PHP 开发的最好方式

    学习现代化 PHP 开发的最好方式是学习现代化的开发框架,如 Laravel ,这些新的 PHP 概念和语法,以及 Composer ,都在框架中广泛使用,并且还可以学习到很多有关设计模式的知识。

    PPT 下载地址

    点此打开 PDF 版 PPT

    第 1 条附言  ·  2016-09-25 23:33:10 +08:00
    43 条回复    2016-10-03 22:30:24 +08:00
    tanteng
        1
    tanteng  
    OP
       2016-09-25 23:02:39 +08:00
    大家对现代化的 PHP 开发有什么看法,可以讨论
    bdbai
        2
    bdbai  
       2016-09-25 23:13:04 +08:00 via Android
    为什么 PHP 非要扯上前端呢。
    tanteng
        3
    tanteng  
    OP
       2016-09-25 23:18:12 +08:00
    @bdbai 这里只是带过一下, PHP 只是 WEB 语言之一, WEB 开发包括前端后端很多方面,也是回顾一下 WEB 开发所涉及的一些技术。
    zqhong
        4
    zqhong  
       2016-09-25 23:30:02 +08:00   ❤️ 1
    tanteng
        5
    tanteng  
    OP
       2016-09-25 23:30:59 +08:00
    @zqhong 谢谢指正!已更新!
    zqhong
        6
    zqhong  
       2016-09-25 23:43:44 +08:00   ❤️ 1
    PHP 语法新特性这里:
    > $a = $_GET['a'] ?? $_GET[‘ a ’]:1;

    似乎没这种用法?我猜您说的是这个:
    > $a = $_GET['a'] ?? 1;

    http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
    sunsh217
        7
    sunsh217  
       2016-09-25 23:55:23 +08:00
    没有 postgresql, 不及格。退回去重写。
    tanteng
        8
    tanteng  
    OP
       2016-09-26 00:03:08 +08:00
    @zqhong 你说的对,这里有误
    tanteng
        9
    tanteng  
    OP
       2016-09-26 00:03:15 +08:00
    @sunsh217 😀
    BMW
        10
    BMW  
       2016-09-26 08:53:37 +08:00
    讲得有点过于基础了吧,这些不是应该是一个 php 程序员都需要掌握的基础概念么?
    gouchaoer
        11
    gouchaoer  
       2016-09-26 09:07:13 +08:00 via Android
    请问你怎么看 laravel 性能底下以及过度包装导致的无法单步调试的问题?
    enda
        12
    enda  
       2016-09-26 09:16:22 +08:00
    请问 CURL 为何归类在调试工具
    frozenshadow
        13
    frozenshadow  
       2016-09-26 09:21:29 +08:00
    @gouchaoer 没用过 laravel 的请教一下:这么夸张?居然不能单步调试?
    frozenshadow
        14
    frozenshadow  
       2016-09-26 09:22:41 +08:00
    再请问下 fiddler 和 curl 中间的小蜜蜂是什么。。。
    stackboom
        15
    stackboom  
       2016-09-26 09:38:27 +08:00   ❤️ 1
    @frozenshadow firebug
    Light3
        16
    Light3  
       2016-09-26 09:55:49 +08:00
    @frozenshadow 应该是甲虫还是瓢虫吧..
    firebug 一个插件比 F12 好看点? https://getfirebug.com/
    tanteng
        17
    tanteng  
    OP
       2016-09-26 09:57:33 +08:00
    @BMW 这跟基础无关,而是 PHP 的开发方式,现在能用上这些的占比估计还是小部分,大部分公司还没用上。也许一年以后,这些还是“新”的东西。
    tanteng
        18
    tanteng  
    OP
       2016-09-26 09:57:51 +08:00
    @enda 没地方放了,哈哈。
    tanteng
        19
    tanteng  
    OP
       2016-09-26 09:58:27 +08:00
    @frozenshadow firebug
    TangMonk
        20
    TangMonk  
       2016-09-26 10:13:17 +08:00
    composer 每次只能 require 一个包,这点很难用。。
    gdtv
        21
    gdtv  
       2016-09-26 10:32:52 +08:00
    php 本来是世界上最容易学的语言( asp 已经过时了不算),经这么折腾, php 这个优点就不复存在了
    ice2016
        22
    ice2016  
       2016-09-26 10:32:58 +08:00
    支持下,好长时间没用 php 了~
    gdtv
        23
    gdtv  
       2016-09-26 10:34:25 +08:00
    php 本来是世界上最容易学的语言( asp 已经过时了不算),经这么折腾, php 这个优点就不复存在了。
    每次我写 laravel 的时候我都在想,我是在写 php 呢还是在写 java 呢?
    用 laravel 写了几个项目,最后还是用回 codeigniter 了。
    iyaozhen
        24
    iyaozhen  
       2016-09-26 10:49:41 +08:00 via Android
    @TangMonk 只能一个包,什么意思?感觉不是啊
    mogp
        25
    mogp  
       2016-09-26 10:51:07 +08:00
    你访问的页面不存在!
    TangMonk
        26
    TangMonk  
       2016-09-26 10:54:54 +08:00
    @iyaozhen 比如说吧,你有个 laravel 项目。你要增加一些其他依赖,你只能通过命令行 composer require XXX, 不能直接修改 composer.json 里的 package 。所以当你需要安装大量的包的时候会蛋疼,不想 ruby 的 bundle ,和 NodeJS 的 NPM 那么好用。
    xiaozi
        27
    xiaozi  
       2016-09-26 11:01:46 +08:00
    总结的写 php 的时候容易掉的坑, http://tool.lu/tip/?q=php
    killerv
        28
    killerv  
       2016-09-26 11:07:14 +08:00
    @TangMonk 为什么不能直接修改 composer.json ?在 composer.json 里面添加包名,然后 composer update 不行吗?
    ylsc633
        29
    ylsc633  
       2016-09-26 11:29:12 +08:00
    @xiaozi 这个网站是你的?
    TangMonk
        30
    TangMonk  
       2016-09-26 11:30:08 +08:00
    @killerv 貌似会把不想 update 的 package 也 update 了
    xiaozi
        31
    xiaozi  
       2016-09-26 11:46:14 +08:00
    @ylsc633 我的, 怎么了?
    pengbo37877
        32
    pengbo37877  
       2016-09-26 11:57:29 +08:00
    感觉没什么用啊,用过 laravel 就能总结出这些
    tanteng
        33
    tanteng  
    OP
       2016-09-26 12:09:01 +08:00
    @pengbo37877 所以说学习现代化 PHP 开发的最好方式是学习现代化的开发框架
    Clarencep
        34
    Clarencep  
       2016-09-26 12:27:29 +08:00
    居然有人把简历放到博客首页显著位置...
    tanteng
        35
    tanteng  
    OP
       2016-09-26 14:26:29 +08:00
    @Clarencep 这是个人博客而已,平时也没多少人看,自己的一个工作经历,我也看到好多博客也挂着简历啊,没什么好奇怪的
    kchum
        36
    kchum  
       2016-09-26 17:02:19 +08:00 via iPhone
    @TangMonk 限定好其他包的版本,不会动到你不想升级的包
    jhdxr
        37
    jhdxr  
       2016-09-27 11:45:40 +08:00
    @gouchaoer laravel 性能低下这个观点先放一放(毕竟看和什么对比,以及用框架最主要是为了提高开发速度,而性能也没有差到不能忍受),不能单步调试我也想问为什么。。。
    如果你指的是因为 laravel 在很多地方都传递的是闭包 /callback ,而不能直接 step into 的话,那么你可以在闭包里下断点。或者多 step over 一些总能进去的。。。
    如果你指的是因为__call 和__callStatic 导致的 IDE 找不到方法,那么可以考虑 `barryvdh/laravel-ide-helper`
    tanteng
        38
    tanteng  
    OP
       2016-09-27 11:53:14 +08:00
    @jhdxr @gouchaoer Laravel 其实性能也没那么低吧,把各种缓存打开,上 OPcache ,响应速度超快了。你非要说性能, PHP 的性能肯定不如 java , c ,如果真有这个问题,这部分用其他语言来写就行了, PHP 就负责调接口。
    gouchaoer
        39
    gouchaoer  
       2016-09-27 16:41:45 +08:00
    @jhdxr laravel 的性能实在是太差了,见 benchmark : https://github.com/kenjis/php-framework-benchmark

    至于无法单步调试的问题,我就一个要求从 index.php 入口开始我 xdebug 单步调试进入框架到路由到 filter 到控制器最后退出,这么多框架只有 laravel 没法做到

    老实说我也关注了一段时间的 laravel ,实在看不出 laravel 美在何处,和 php 最大限度最求性能+实用背道而驰,就像 php 框架中的绿茶婊一样
    jhdxr
        40
    jhdxr  
       2016-09-27 18:27:36 +08:00
    @gouchaoer 对于性能的观点我依然不变,框架的性能在 99%的场景下还不足以成为瓶颈。开发效率优先。当然我并不否认你的观点和数据(例如各种魔术方法,使用对象而非数组,在 php 里都会导致大幅变慢)

    然后单步的这个需求,我看了一眼我觉得 laravel 也是完全可以做到的啊,也许你需要换个 ide ,例如 phpstorm 就不错。但是,因为 laravel 大量使用了闭包,所以按照你的这个要求,单步会很蛋疼,因为会跳来跳去,而且有大量的例如 pipeline 之类的框架类 /方法在其中。

    框架的喜好各有所爱,同样也不回复了←不想引战
    gouchaoer
        41
    gouchaoer  
       2016-09-27 18:56:09 +08:00 via Android
    @jhdxr 实际系统中的访问恰恰是命中缓存的情况最多,所以你说实际系统瓶颈在数据库而 helloworld 无法说明问题那是站不住脚的。。。。
    shlabc
        42
    shlabc  
       2016-10-03 15:55:18 +08:00
    Laravel 刚出来时,感觉真挺美的,也研究了一阵,后来实在受不了速度。最后还是选的 YII2 (在开发团队合作、用户规模、正规化、速度之间取的平衡)。

    一些简单程序,都直接用最原生 PHP 。
    tanteng
        43
    tanteng  
    OP
       2016-10-03 22:30:24 +08:00
    @shlabc 用 Laravel 自带的路由缓存,配置缓存等,再开启 PHP 的 Opcache ,速度应该很快了啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1836 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:20 · PVG 00:20 · LAX 08:20 · JFK 11:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.