文章目录
- 前言
-
-
- [第一步:PHP 语法速查(1-2小时)](#第一步:PHP 语法速查(1-2小时))
- [第二步:ThinkPHP 5.1 核心映射(2小时)](#第二步:ThinkPHP 5.1 核心映射(2小时))
- 第三步:直接读项目核心代码(3小时)
-
- [1. 入口文件(5分钟)](#1. 入口文件(5分钟))
- [2. 基类(30分钟)--- 理解整个项目的骨架](#2. 基类(30分钟)— 理解整个项目的骨架)
- [3. 一个完整的CRUD(1小时)--- 掌握开发模式](#3. 一个完整的CRUD(1小时)— 掌握开发模式)
- [4. API接口(1小时)--- 理解对外接口设计](#4. API接口(1小时)— 理解对外接口设计)
- [5. 后台命令(30分钟)--- 理解异步处理](#5. 后台命令(30分钟)— 理解异步处理)
- 第四步:动手实践(2小时)
- [第五步:PHP 生态速查(30分钟)](#第五步:PHP 生态速查(30分钟))
- [🎯 关键差异提醒](#🎯 关键差异提醒)
-
- [1. PHP 是同步阻塞的](#1. PHP 是同步阻塞的)
- [2. PHP 没有常驻内存](#2. PHP 没有常驻内存)
- [3. ThinkPHP 的 Facade 模式](#3. ThinkPHP 的 Facade 模式)
- [4. 模板引擎语法](#4. 模板引擎语法)
- [📋 速查清单](#📋 速查清单)
-
前言
第一步:PHP 语法速查(1-2小时)
你只需要知道 PHP 和你熟悉的语言的差异点:
| 概念 | Java/JS/Python | PHP |
|---|---|---|
| 变量 | name = "xxx" |
$name = "xxx" |
| 字符串拼接 | "a" + "b" |
"a" . "b" |
| 数组 | [1,2,3] 或 {k:v} |
统一用 [],索引和关联都是数组 |
| 方法调用 | obj.method() |
$obj->method() |
| 静态方法 | Class.method() |
Class::method() |
| 命名空间 | import com.xxx |
use app\admin\controller |
| 构造函数 | constructor() |
__construct() |
| 访问修饰符 | private/protected/public |
一样 |
| 继承 | extends |
一样 |
| 三元运算 | a ? b : c |
一样,还有 ?? (null合并) |
PHP 独有特性:
php
// 1. $this → 当前对象
$this->db->table('user')->find();
// 2. :: → 静态调用
Cache::store('redis')->get('key');
// 3. -> → 对象调用
$user = new UserModel();
$user->getList();
// 4. 数组操作
$arr = ['name' => 'Tom', 'age' => 25];
$arr['name']; // Tom
// 5. 魔术方法
__construct() // 构造
__get() // 属性访问
__call() // 方法调用
第二步:ThinkPHP 5.1 核心映射(2小时)
把 ThinkPHP 映射到你已知的框架概念:
| 概念 | Spring Boot | Express/Koa | ThinkPHP 5.1 |
|---|---|---|---|
| 路由 | @RequestMapping |
app.get('/path') |
route/route.php 或 自动路由 |
| 控制器 | @Controller |
router.handler |
class Xxx extends Controller |
| 模型 | @Entity |
Mongoose Model | class Xxx extends Model |
| 中间件 | @Filter |
app.use(middleware) |
中间件类 |
| 配置 | application.yml |
config.js |
config/*.php |
| 模板引擎 | Thymeleaf | EJS/Pug | ThinkPHP Template |
| ORM | JPA/Hibernate | Mongoose | Db类 / Model类 |
ThinkPHP 的核心约定:
URL: /模块/控制器/方法
/admin/user/lists
↓ ↓ ↓
admin User lists()
文件位置: application/admin/controller/User.php
视图位置: application/admin/view/user/lists.html
第三步:直接读项目核心代码(3小时)
按这个顺序读,效率最高:
1. 入口文件(5分钟)
public/index.php → thinkphp/base.php → App::run()
2. 基类(30分钟)--- 理解整个项目的骨架
admin/controller/Parents.php → 登录验证(Cookie+Redis)
api/controller/Init.php → API基类(签名+加密+返回格式)
3. 一个完整的CRUD(1小时)--- 掌握开发模式
admin/controller/Admin.php → 控制器
admin/model/AdminModel.php → 模型
admin/view/admin/lists.html → 视图
admin/config/database.php → 配置
4. API接口(1小时)--- 理解对外接口设计
api/controller/Pay.php → 支付流程
api/controller/User.php → 用户接口
5. 后台命令(30分钟)--- 理解异步处理
common/command/Chat.php → Redis发布订阅
common/command/Onlinenum.php → 在线人数
第四步:动手实践(2小时)
直接在这个项目上写一个模块,最快的掌握方式:
创建一个 demo 模块,包含完整 CRUD:
application/demo/
├── controller/
│ └── Article.php ← 控制器
├── model/
│ └── Article.php ← 模型
├── view/
│ └── article/
│ ├── lists.html ← 列表页
│ ├── add.html ← 添加页
│ └── edit.html ← 编辑页
└── config/
├── database.php ← 数据库配置
├── cache.php ← 缓存配置
└── app.php ← 应用配置
第五步:PHP 生态速查(30分钟)
| 工具 | 作用 | 类比 |
|---|---|---|
| Composer | 包管理 | npm / Maven / pip |
composer.json |
依赖声明 | package.json / pom.xml |
vendor/ |
依赖目录 | node_modules/ |
phpunit |
单元测试 | Jest / JUnit |
php think |
CLI工具 | npm run / artisan |
🎯 关键差异提醒
1. PHP 是同步阻塞的
php
// PHP: 一个请求一个进程,执行完就释放
// 不像 Node.js 的事件循环
// 不像 Go 的协程
// 所以需要 Redis 发布订阅来做"异步"
2. PHP 没有常驻内存
php
// 每次请求都是全新的
// 变量不会跨请求保留
// 所以需要 Redis/Cache 来存储状态
// 这就是为什么登录状态要存 Redis
3. ThinkPHP 的 Facade 模式
php
// 看起来像静态调用,实际是代理
Cache::get('key'); // 看似静态方法
Db::table('user'); // 看似静态方法
// 实际底层是:
// Cache → think\facade\Cache → 容器中取出 Cache 实例 → 调用实例方法
// 类似 Java 的依赖注入 + 静态代理
4. 模板引擎语法
html
<!-- 输出变量 -->
{$username}
<!-- 循环 -->
{foreach $list as $item}
{$item.name}
{/foreach}
<!-- 条件 -->
{if $status == 1}
启用
{else/}
禁用
{/if}
<!-- 引入公共模板 -->
{include file="public/head" /}
📋 速查清单
✅ PHP语法 → 变量$ 对象-> 静态:: 拼接.
✅ ThinkPHP路由 → /模块/控制器/方法
✅ 控制器 → extends Controller, fetch()渲染, assign()传参
✅ 模型 → extends Model, 链式查询
✅ 视图 → {$var}, {foreach}, {if}
✅ 配置 → Config::get(), 多层覆盖
✅ 缓存 → Cache::store('redis')
✅ 数据库 → Db::table()->where()->find()
✅ 请求 → input(), Request::post()
✅ 命令行 → php think xxx, extends Command
✅ Facade → 静态代理模式
✅ Cookie/Session → Cookie::set/get, Session::set/get