先说明一下,PHP 8.4在本文写作时尚未正式发布(预计2024年11月发布),本文基于PHP 8.4的开发版和RFC提案来写。如果你想学习PHP 8.4,可以先从开发版和RFC文档入手,等正式发布后再深入学习。
每次PHP发布新版本,我都会第一时间去学习新特性。从PHP 7到PHP 8,再到现在的PHP 8.4,我总结了一套自己的学习方法。这篇文章就来分享一下我是怎么学习PHP新版本的,希望能帮到你。
为什么要学新版本
很多人会问,PHP新版本有什么好学的,旧版本不是一样用吗?
我觉得学习新版本很有必要,原因有几个。
第一,新特性能提升开发效率。每个新版本都会加入一些新的语法和函数,能让代码更简洁、更易读。比如PHP 8.0的match表达式、命名参数、构造函数属性提升,这些特性能让代码少写很多行,可读性也更好。
第二,新特性能提升代码质量。比如PHP 8.0的联合类型、mixed类型,PHP 8.1的枚举、只读属性,PHP 8.2的只读类,这些特性能让类型系统更完善,减少bug。
第三,性能提升。每个新版本都会有性能优化,PHP 8.0比PHP 7.4快了大概10%到20%,后续版本也有持续优化。升级到新版本,不用改代码就能获得性能提升。
第四,安全更新。PHP的每个版本都有支持周期,旧版本停止维护后就不会有安全更新了。学习新版本,及时升级,能保证项目的安全性。
第五,保持竞争力。技术在不断发展,如果你一直停留在旧版本,不学习新特性,慢慢就会落后。学习新版本,能让你保持对技术的敏感度,提升自己的竞争力。
所以,每次PHP发布新版本,我都会花时间去学习,把新特性用到项目里。
第一步:看官方文档和RFC
学习新版本的第一步,是看官方文档和RFC。
PHP官方的更新文档是最权威的信息来源。每次发布新版本,官方都会发布更新日志,列出所有的新特性、改进、废弃和不兼容变更。我会先通读一遍更新日志,对新版本有一个整体的了解。
然后是看RFC。PHP的每个新特性都是通过RFC(Request for Comments)流程加入的,RFC文档里详细说明了这个特性的背景、设计思路、用法、争议点。看RFC能让你深入理解一个特性为什么要这么设计,而不只是知道怎么用。
比如PHP 8.1的枚举特性,RFC里详细讨论了为什么要支持枚举,枚举应该有哪些功能,和其他语言的枚举有什么区别,有哪些争议点。看完RFC,你对枚举的理解会比只看文档深很多。
看RFC还有一个好处,就是能了解特性的边界。每个特性都有它不支持的场景,RFC里会说明为什么不支持。了解这些边界,能避免你在实际使用中踩坑。
我一般会在新版本发布前几个月就开始关注RFC,看哪些特性被接受了,哪些被拒绝了。这样等新版本正式发布的时候,我已经对大部分新特性有了了解。
第二步:整理新特性清单
看完官方文档和RFC之后,我会整理一份新特性清单。
清单里包括每个新特性的名称、简单描述、使用场景、示例代码。整理清单的过程,也是加深理解的过程。把一个特性用自己的话描述出来,写一个示例代码,能检验你是不是真的理解了。
我一般会把新特性分成几类:
第一类是语法糖。比如match表达式、箭头函数、命名参数、空安全运算符。这些特性能让代码更简洁,学习成本低,容易上手。
第二类是类型系统增强。比如联合类型、交集类型、mixed类型、never类型、枚举、只读属性。这些特性能让类型检查更严格,减少bug,学习成本中等。
第三类是新功能。比如属性(Attributes)、纤程(Fibers)、枚举类、First-class可调用语法。这些是比较大的新功能,学习成本高一些,需要花时间理解。
第四类是函数和类的新增。比如新增的字符串函数、数组函数、标准库类。这些比较零散,可以用到的时候再查。
第五类是废弃和不兼容变更。这部分很重要,升级的时候需要注意。比如废弃的函数、移除的扩展、默认值的变化。整理出来,升级的时候逐一检查。
整理好清单之后,我会把它放在一个文档里,方便以后查阅。有时候还会写成博客文章,分享给其他人。
第三步:动手写示例代码
整理完清单之后,就要动手写示例代码了。
看文档和RFC是输入,写代码是输出。只有自己动手写过,才能真正掌握一个特性。我会给清单里的每个新特性都写几个示例代码,从简单到复杂。
比如学习枚举的时候,我会写:
// 基础枚举 enum Status { case Active; case Inactive; case Pending; }
// 带值的枚举 enum Role: string { case Admin = 'admin'; case User = 'user'; case Guest = 'guest'; }
// 枚举方法 enum OrderStatus { case Pending; case Processing; case Completed; case Cancelled;
public function label(): string { return match($this) { self::Pending => '待处理', self::Processing => '处理中', self::Completed => '已完成', self::Cancelled => '已取消', }; } }
// 实际使用 class Order { public function __construct( public string $id, public OrderStatus $status, ) {} }
$order = new Order('123', OrderStatus::Processing); echo $order->status->label(); // 处理中
写示例代码的时候,我会尽量结合实际场景,而不是写无意义的hello world。因为只有在实际场景中,你才能体会到一个特性的好处和局限。
写示例代码的过程中,经常会发现一些文档里没说清楚的细节,或者一些坑。这时候我会去查RFC或者源码,把问题搞清楚。
第四步:在测试项目中使用
写完示例代码之后,我会在一个测试项目中实际使用这些新特性。
我有一个专门的测试项目,用来实验新技术。每次PHP发布新版本,我都会把这个项目升级到新版本,然后用新特性重构一部分代码。
比如PHP 8.0发布的时候,我用match表达式重构了项目里所有的switch语句,用构造函数属性提升简化了所有的类定义,用命名参数优化了一些参数很多的函数调用。
PHP 8.1发布的时候,我用枚举重构了项目里所有的状态常量,用只读属性重构了一些不可变的值对象,用纤程实验了一下异步编程。
PHP 8.2发布的时候,我用只读类重构了一些DTO,用trait常量优化了一些trait的定义。
在实际项目中使用新特性,和写示例代码完全不一样。示例代码是理想化的,实际项目中有各种约束和历史包袱。在实际项目中使用新特性,你会遇到各种问题,比如和旧代码的兼容、性能影响、团队成员的接受度等。
比如用枚举重构状态常量的时候,你会发现数据库里存的是字符串,枚举和数据库字段之间需要转换;序列化和反序列化的时候需要处理;旧代码里用字符串比较的地方需要改成枚举比较。这些问题,在写示例代码的时候是不会遇到的。
在测试项目中踩过坑之后,你对新特性的理解会更深入,也更有信心在正式项目中使用。
第五步:在正式项目中逐步引入
在测试项目中验证过之后,就可以在正式项目中逐步引入新特性了。
注意是逐步引入,不是一次性全部重构。正式项目有用户在用,稳定性很重要。一次性大改风险太高,容易出问题。
我的做法是,新写的代码尽量用新特性,旧代码保持不变。比如新写的类用构造函数属性提升,新写的状态用枚举,新写的switch用match。这样新代码享受新特性的好处,旧代码不用动,风险可控。
等新特性用熟了,团队也接受了,再考虑重构一些旧代码。重构的时候,一个模块一个模块地来,改完一个测试一个,确保没有问题再改下一个。
引入新特性的时候,还要考虑团队成员的水平。如果团队里有人不熟悉新特性,要先做培训,或者写一些规范和示例,确保大家都能正确使用。不然新特性用错了,反而会增加bug。
还有就是要考虑PHP版本的兼容性。如果你的项目需要支持多个PHP版本,那新特性就不能随便用,因为旧版本不支持。可以用polyfill或者条件判断来兼容,但比较麻烦。最好的方式是统一升级到新版本,然后再用新特性。
第六步:持续关注和更新
学习新版本不是一次性的事情,而是一个持续的过程。
PHP的版本更新很快,每年都会有一个小版本,每几年会有一个大版本。每个版本都有新特性和改进,需要持续关注。
我会订阅PHP的官方博客和邮件列表,每次有新版本发布或者RFC投票,都会收到通知。还会关注一些PHP技术社区和大牛的博客,看他们对新特性的解读和使用经验。
每次PHP发布新版本,我都会重复上面的学习流程:看文档和RFC、整理清单、写示例、测试项目使用、正式项目引入。虽然每次都要花不少时间,但收获也很大。
除了学习PHP本身的新特性,我还会关注PHP生态的发展。比如Composer的新版本、PHPUnit的新版本、Laravel和Symfony等框架的新版本。这些工具和框架也会不断更新,学习它们的新特性也很重要。
学习PHP 8.4的重点
回到PHP 8.4,根据目前的RFC和开发版,我觉得学习重点有几个。
第一个是属性的改进。PHP 8.4对属性(Attributes)做了一些增强,比如属性可以用在更多地方,属性的验证更严格。属性是PHP 8.0引入的功能,很多框架已经在用了,8.4的改进会让属性更好用。
第二个是新的数组函数。PHP 8.4新增了一些数组函数,比如arrayfind、arrayfindkey、arrayany、array_all等。这些函数能让数组操作更简洁,不用再写foreach循环了。
第三个是隐式可空类型的废弃。PHP 8.4废弃了隐式可空类型,也就是参数类型是T但默认值是null的情况。以后需要显式写成?T。这个变更会影响很多旧代码,升级的时候需要注意。
第四个是新的对象初始化语法。PHP 8.4可能会加入新的对象初始化语法,让创建对象和设置属性更简洁。这个特性还在讨论中,如果加入的话会很实用。
第五个是性能优化。PHP 8.4在性能上也有优化,特别是在数组操作和函数调用方面。虽然提升幅度不大,但聊胜于无。
当然,PHP 8.4正式发布的时候可能还会有其他新特性,需要到时候再看。
常见的学习误区
最后说几个学习新版本时常见的误区。
第一个误区是为了用新特性而用新特性。新特性是为了解决问题的,如果旧代码没有问题,就不用改。不要看到新特性就想着重构,那样只会增加风险。
第二个误区是只看不练。很多人看了文档和教程,觉得自己懂了,但一动手写就出错。学习新特性一定要动手写代码,在实际项目中使用,才能真正掌握。
第三个误区是不看废弃和不兼容变更。很多人只关注新特性,不看废弃和不兼容变更,结果升级的时候出了问题。升级之前一定要仔细看不兼容变更,逐一检查代码。
第四个误区是不考虑团队。引入新特性的时候,要考虑团队成员的接受度和水平。如果团队里有人不熟悉,要先做培训,不然新特性用错了反而不好。
第五个误区是追新。不是每个新版本都要马上升级,特别是生产环境。可以等新版本发布几个月,稳定了之后再升级。学习可以提前,升级要谨慎。
写在最后
学习PHP新版本是一个持续的过程,也是一件很有乐趣的事情。每次新版本发布,都能看到PHP在不断进步,变得更好用、更快、更安全。
我的学习路线是:看官方文档和RFC、整理新特性清单、动手写示例代码、在测试项目中使用、在正式项目中逐步引入、持续关注和更新。这套方法不一定适合所有人,但可以作为参考。
PHP 8.4虽然还没正式发布,但现在已经可以开始关注了。看看RFC,试试开发版,等正式发布的时候就能快速上手。
技术在不断发展,我们也要不断学习。希望这篇文章能帮你找到适合自己的学习方法,快速掌握PHP 8.4的新特性。
有什么问题欢迎交流,一起学习进步。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录