友荐云推荐
我的 PHP 学习路线

1. PHP 入门

PHP 入门没啥好说的,会基本编码,基本的开发结构(通常指MVC,呵呵哒),类与对象,就差不多了,可以说是入门了。

1.1 OOP

写 PHP 最多目前无非就是 OOP,面向对象,说时迟那时快。不开玩笑地说,与我共事的某些前辈是连 OOP 都搞不清的,这里我就不多说了。

其实不是说一定要会,要去理解 OOP,只是如果你理解这个玩意,对于你后面的工作已经学习会非常的有好处。

其实面向对象也没有那么复杂,只要理解一点,单一职责,其实就是一个对象越简单越好。

也就是说,是自己该做就由自己做,不该由自己做的就不要自己做。

1.2 MVC

老梗了,所谓 MVC 很多人会说 Model, View, Controller, 其实这样说没错的,只是这样说不会让你更好地理解结构以及扩展性。

MVC 我当前的理解是:调用(度),也很简单,其他框架也差不多这个原理,当然每个框架的实现方式都不一样。

基本流程:

+--------------+      +-----------+      +--------------+                  +--------------+
|              |  ----+  request  +----> |              |  ------------>   |              |
|              |      +-----------+      |              |                  |              |
|   Request    |                         | Route Match  |                  |    Handle    |
|              |      +-----------+      |              |   +----------+   |              |
|              | <----+ Response  +----- |              | <-+ Response +-- |              |
+--------------+      +-----------+      +--------------+   +----------+   +--------------+

大致列了下最基础的框架底层原理,实际上咱们开发中 90% 接触的只是在 Handle 处的工作,至于 RequestMatchRoute 等基础的对象或者数据,框架早已经封装好了,也无需过度纠结和头疼这方面的事情,先要把业务功能处理好,并且容错处理好即可。

简单总结一句话:知其然而不知其所以然


2. PHP 进阶进阶这个真是个头疼的问题,啥叫进阶,我的理解是,做一些之前没有做过的(指本领域:PHP),例如:设计模式,SPL,缓存设计(Cache), 研究框架,开发规范,单元测试,行为驱动开发,组件(包括自己着手开发的),Composer 等等的东西,都可以理解为进阶。

框架推荐:

  1. Symfony
  2. Laravel
  3. Yaf

PHP 开发规范(PSR):

  1. PHP FIG

PHPUnit & TDD/BDD:

  1. PHPUnit
  2. PHP spec

设计模式:

  1. 设计模式

SPL:

  1. PHP SPL

Composer:

  1. Composer

欢迎补充

2.1 设计模式

设计模式,一个在软件设计中占有重要角色的课程,而我们又不得不去了解。而对于设计模式来说,很多人是抗拒的,因为他和普通的开发者有着不一样的思维方式,一个很明显的提升就是: 设计,而设计应该是根据发展的变化而变化,业务的变化而变化,模式也一样,不会是永恒不变的。唯一不变的是,基础,这些技巧与思维少不了的是需要良好的基础。

所以说,基础是多么重要的,任何一切的一切都是建立与基础之上,这叫积累。如同盖楼。

在这些已有基础,我们需要学习并且还需要学会各种推陈出新,这样才可以让自己让他人走得更远。

设计模式学习推荐: 设计模式

2.2 资源节省

当今互联网,每秒钟都是钱,能节省的,绝对不能浪费,而且节省还可以一定地提高服务的质量。

一般我们说的资源是:

  1. 内存
  2. 带宽
  3. 磁盘
  4. CPU

而这些之间其实是有一定的关联的,和代码质量和容错机制也有一定关系。

上述每一个都很重要,决定着你的服务质量。

能少占用内存就少占用内存,图片、媒体资源能压缩就压缩,减少无用的存储,降低代码的复杂度。

2.3 容错

比较常见的是: file_get_contentsconnection,有时候我们会很自然地遗忘这里其实会有一定几率出现超时,最严重的就是造成服务无响应,如下代码:

file_get_contents('https://www.google.com/');

这代码分分钟被打,活生生将程序毁了。

如果发生超时,会占用大量 CPU,严重可能会导致服务无响应,危害极大。

容错是每个开发者在开发过程中必须要考虑的地方,没有代码没有 “八阿哥”,总会有意外的地方,做好容错可以最大程度地减少对用户的伤害以及可以有效提高在出错时的用户体验。百利而无一害。

2.4 日志

日志,一个很容易被无视而又非常非常重要的环节,可以说,这一环节比你做的任何一个地方的业务代码都要重要。

日志的好处:

  1. 记录,跟踪
  2. 调试
  3. 恢复
  4. 分析
  5. 调优
  6. 等等...

好处有好多,但在我们开发者当中,其日志最重要的功能之一就是,记录问题,调试代码,优化架构。

不得不说日志的重要性,请你好好重视这一个容易被忽略的环节。

而日志的设计需要考虑性能,不能因为日志而影响服务质量哦。所以在日的环节在完整性和效率上要做好权衡。

2.5 缓存设计

缓存必须是针对业务情况而设计,不能生搬硬套。大公司的不一定适合你,开源方案也不一定不适合你,一定要找到自己合适的方案。

而在缓存设计方面,我个人推荐这一系列的文章: 缓存使用与设计

通俗简单地说,缓存的目的是为了提高服务的响应速度以及质量,不能因为缓存的添加而导致服务异常。

2.6 原理理解 (这里说到框架的研究,说得不好的地方,请多多批评和教导)

我们平时开发接触不同的开发工具,操作,甚至是监控,那么他们其中的原理,你又理解么?

其实我们每天接触的东西都有它的实现原理,算法等等的东西,但我们一直都在使用,并没有很好地去理解他们当中的奥秘。时候有空去接触一下了。

首先,开发,编码我觉得就是将现实生活搬到互联网中,我举个例子:

为什么人访问量上来了,咱们就要扩容,去扩展呢?原理很简单,看看咱们超市里面的收银台就知道了。咱们超市里面所有收银台不是每天每个位置都有人 的,根据人流(流量)动态扩容,而且有些收一台的一个位置上设置有两个人(多线程/多进程,看个人理解),这个设计挺妙的。当人一多,就会开多各个位置收 银台,和增加人手。那他是怎么知道人多的呢?也很简单,就是经理(Manager/Master进程或者是运维,看理解),他知道,内部调度安排人手。

大致举了这么一个例子来说明扩展的原理。

回到正题: 框架

相信大家都有接触过很多不同的框架,CI, TP, Symfony, Yii, Laravel, Slim等等,最深刻,最相似的地方在哪里呢?可能有些没有,但是,有一点可以肯定的,就是,都是有一系列 Http 封装,Route 处理。因为这两是灵魂,剩下的是不是业务和结构。

剩下的就是考验框架代码质量的时候了,这里有一系列的框架,有的轻量,有的重量,有的灵活,有的高效。其实说到这里很多朋友都大概了解框架的运行原理。

我看过Symfony、Laravel、CI、Silex和ThinkPHP的代码,当然很粗略地看看。里面实现的大部分代码都是将各个处理模块 “粘合” 一起,也就是 "Bridge"。

大致流程图:

   +----------+           +-------------+                      +------------+
   |          |           |             |                      |            |
   |  Client  |---------->| Application |--------------------->|   Start    |
   |          |           |             |                      |            |
   +----------+           +-------------+                      +------------+
         ^                                                            |
         |                                                            |
         |                                                            v
         |                         +-------------+             +-------------+
         |                         |             |             |             |
         |                         |  Container  |------------>|  Bootstrap  |-----+
         |                         |             |             |             |     |
         |                         +-------------+             +-------------+     |
         |                                ^                                        |     +------------+
         |                        +-------+--------+                               |     |            |
         |                        |                |                               +---->|  Request   |
         |                  +-----------+    +-----------+                               |            |
         |                  |           |    |           |                               +------------+
         |                  |   Route   |    |  Service  |                                      |
         |                  |           |    |           |                                      |
+----------------+          +-----------+    +-----------+       +-------------+                |
|                |                                               |             |                |
|    Response    |                                               | Dispatcher  |                |
|                |<----------------------------------------------|             |<---------------+
|                |                                               |             |
+----------------+                                               +-------------+
                                                                        ^
                                                                        |
                                                                        +--------------+
                                                                        |              |
                                                                        |              v
                                                                        |        +----------+
                                                                        |        |          |
                                                                        +--------|Controller|
                                                                                 |          |
                                                                                 +----------+          

当你了解了这些流程以及所需的组建,用先用的组件的话都是可以很方便地组合出自己想要的框架。

其实我这里希望更多的初学者多看看 ThinkPHP 的代码,然后也看看其他开源框架的代码,你会发现,除了 ThinkPHP 之外,你还可以发现更多新奇好玩的东西。

最终其实还是离不开自己动手开发一个。

具体框架开发系列我会找个时间与大家分享。框架的理解可谓到一段落,下次我会分享我对其他服务器的理解。

来到这个阶段的,应该始终有一个意识:服务质量高于一切,就是不能因为添加服务而影响原有的服务

简单总结一下。大量动手实践自己的猜想,分析自己做过的项目并且优化自己觉得不足的地方。

总结: 知其然并且知其所以然

3. PHP 高手模式我相信经过九九八十一难,能来到这个模式的人已经不多了。我自己还是菜鸟,不敢在这里胡说,这里会记录我所有的 PHP 底层学习的经过,这里的故事,我想我等不到下一个故事了。

  1. Unix 环境高级编程
  2. tcp/ip 网络编程
  3. PHP 扩展开发
  4. 颈椎病康复指南
  5. 活着

3.1 Unix 环境高级编程

为什么要理解并学习这一方面的知识?若果你是一名有追求的 PHP 开发者,最终还是应该将精力落入到 “系统” 处,因为真正处理 PHP 程序的,正正是 “系统”,如何可以让自己的 PHP 做得更好,如何可以让自己的服务做的更好,如何可以让后端支持更加强大,灵活,高效,你就应该关注到底层系统的实现当中,但平时也不要忘了 PHP 的开发规范。

此处的文章和笔记,我将会在以后的 Unix 学习一系列当中给大家呈现。

3.2 tcp/ip 网络编程

在日常生活中,Http 已经离不开大家了,从平时打开应用,打开浏览器,搜索,都是需要使用 Http,应该没有比这个接触更多了吧。但是里面的奥秘你又知道多少?没关系,和我一起探索 TCP/IP 的奥秘吧。

文章和笔记,以后会在 TCP/IP 章节中给大家呈现.

3.3 PHP 扩展开发

学习扩展开发和学习 PHP 是一样一样的,根据 PHP 手册上的流程...

  1. 语言参考
  2. 基本语法
  3. 类型
  4. 变量
  5. 常量
  6. 表达式
  7. 运算符
  8. 流程控制
  9. 函数
  10. 类与对象
  11. 命名空间
  12. Errors
  13. 异常处理
  14. 生成器
  15. 引用的解释
  16. 预定义变量
  17. 预定义异常
  18. 预定义接口
  19. 上下文(Context)选项和参数
  20. 支持的协议和封装协议

看到这里应该要懂得举一反三的了,后面的看你们的造化了......

此处的文章和笔记,我将会在以后的 PHP 扩展开发 学习一系列当中给大家呈现。

预告这些系列文章可能不会太快给大家呈现,因为除了工作还有生活,我希望大家可以共同进步,一起去分享相关的经验和知识。感恩大家。