PHP
- 第一个查看PHP环境
- 查看Apache环境
-
- [解释一下 ==wnmp==](#解释一下 ==wnmp==)
- 区别
-
- [Laravel 底层](#Laravel 底层)
- [TP5 底层](#TP5 底层)
- 下载框架
-
- ==tp5==
-
- TP5核心目录
- [_GET / _POST / _SESSION / _COOKIE / _SERVER / _FILES(TP5 写法)](#_GET / _POST / _SESSION / _COOKIE / _SERVER / _FILES(TP5 写法))
- 路由(route/route.php)
- 控制器(application/index/controller/User.php)
- [数据库(Db / 模型)](#数据库(Db / 模型))
- 模型(app/index/model/User.php)
- 常用命令
- 学习路径(新手必看)
- ==laravel==
-
- [Laravel 核心目录](#Laravel 核心目录)
- 常用功能速查(手册核心)
- [Laravel 最核心的 3 个东西(必须懂)](#Laravel 最核心的 3 个东西(必须懂))
- 最简单运行流程(秒懂)
- 例子:
- tp5
-
- [PHP 原生最经典结构(真实项目结构)](#PHP 原生最经典结构(真实项目结构))
- [原生 PHP 运行原理(超级重要)](#原生 PHP 运行原理(超级重要))
- [原生 PHP 最标准写法(你必须会)](#原生 PHP 最标准写法(你必须会))
- 查询数据(原生写法)
- [输出 HTML(原生最经典写法)](#输出 HTML(原生最经典写法))
- [表单提交(原生 POST)](#表单提交(原生 POST))
- [PHP 原生底层核心特点(面试必问)](#PHP 原生底层核心特点(面试必问))
- 实例
-
- [_GET](#_GET)
- [_POST](#_POST)
- [_COOKIE](#_COOKIE)
- [_SESSION](#_SESSION)
- [_SERVER](#_SERVER)
- [_FILES](#_FILES)
- [原生 PHP 和框架的底层区别(重点)](#原生 PHP 和框架的底层区别(重点))
-
- [原生 PHP](#原生 PHP)
- 框架(Laravel/TP)
- [完整可运行的原生 PHP 示例](#完整可运行的原生 PHP 示例)
- 解释你选中的这行代码:
- 底层原理(非常重要)
- [PHP 最常用、常被称作三种输出方式一般是指这三个:](#PHP 最常用、常被称作三种输出方式一般是指这三个:)
- 打印类型
- [Apache + PHP 运行原理](#Apache + PHP 运行原理)
-
- [Apache(HTTP 服务器)](#Apache(HTTP 服务器))
- PHP(脚本解释器)
第一个查看PHP环境
- 先配置环境,win+r
- 然后cmd
- 输入:
javascript
php -v
javascript
C:\Users\Admin>php -v
PHP 7.3.4 (cli) (built: Apr 2 2019 21:57:22) ( NTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
说明环境没问题
查看Apache环境
- 小皮面板(phpStudy)一键安装 Apache(最推荐),直接在小皮里下载安装 Apache 即可:
- 打开小皮面板 → 软件管理

- 找到 Apache → 点击 安装
选择 Apache 2.4.x 稳定版(如 2.4.57)。

- 安装完成后 → 首页 启动 Apache

解释一下 wnmp
| WNMP | 解释 |
|---|---|
| W | win系统 |
| N | nginx (高性能的 Web 服务器) |
| M | MySQL (数据库) |
| P | php (编程语言) |
区别
Laravel 底层
- 全容器化、全依赖注入、全服务提供者、全中间件管道
- 高度解耦、扩展性极强、适合大型复杂项目、长期维护
- 代码优雅、学习曲线较陡、生态极丰富
TP5 底层
- 轻量容器、混合调用(全局函数 + DI)、流程直接
- 快速上手、开发高效、性能好、适合中小型项目、快速迭代
- 中文友好、配置灵活、自动映射友好
下载框架
tp5
看开发手册tp5: tp5开发手册.
- 下载tp5 框架
TP5核心目录
javascript
//plaintext
tp5/
├── application/ # 应用目录(控制器、模型、视图)
├── config/ # 全局配置(app/database/cache等)
├── route/ # 路由文件(route.php)
├── public/ # 入口(index.php)、静态资源
├── extend/ # 扩展类库
├── vendor/ # Composer依赖
├── thinkphp/ # 框架核心
└── .env # 环境变量(数据库、调试开关)
_GET / _POST / _SESSION / _COOKIE / _SERVER / _FILES(TP5 写法)
- 获取 GET/POST 参数(Request)
javascript
// 助手函数(推荐)
input('get.name'); // $_GET['name']
input('post.email'); // $_POST['email']
input('param.id'); // 自动识别 GET/POST
input('cookie.user_id'); // $_COOKIE['user_id']
// 对象方式(控制器内)
use think\Request;
$request = Request::instance();
$name = $request->get('name');
$email = $request->post('email');
$all = $request->param(); // 所有参数
- Session(会话)
javascript
// 助手函数
session('user', '张三'); // 设置 $_SESSION['user']
session('user'); // 获取
session('user', null); // 删除
// 对象方式
use think\Session;
Session::set('name', 'Tom');
Session::get('name');
- Cookie
javascript
// 助手函数
cookie('name', 'value', 3600); // 保存1小时
cookie('name'); // 获取
cookie('name', null); // 删除
// 对象方式
use think\Cookie;
Cookie::set('id', 100, 3600);
- $_SERVER 信息
javascript
input('server.REQUEST_METHOD'); // 请求方式
input('server.REQUEST_URI'); // 当前URL
input('server.HTTP_USER_AGENT');// 浏览器信息
- 文件上传($_FILES)
javascript
// 单文件
$file = request()->file('avatar');
if ($file) {
$info = $file->move(ROOT_PATH . 'public/uploads');
if ($info) {
echo $info->getSaveName();
}
}
// 多文件
$files = request()->file('image');
foreach($files as $file){
// 同上
}
路由(route/route.php)
javascript
// GET
Route::get('user/:id', 'index/User/read');
// POST/PUT/DELETE
Route::post('user', 'index/User/save');
Route::put('user/:id', 'index/User/update');
Route::delete('user/:id', 'index/User/delete');
// 资源路由(7大标准接口)
Route::resource('post', 'index/Post');
控制器(application/index/controller/User.php)
javascript
namespace app\index\controller;
use think\Controller;
class User extends Controller
{
// 列表
public function index()
{
$list = db('user')->select();
$this->assign('list', $list);
return $this->fetch();
}
// 详情
public function read($id)
{
$user = db('user')->find($id);
return json($user);
}
// 新增
public function save()
{
$data = input('post.');
db('user')->insert($data);
return redirect('user/index');
}
}
数据库(Db / 模型)
javascript
// 查询
db('user')->where('id', 1)->find();
db('user')->where('age', '>', 18)->select();
// 新增
db('user')->insert(['name'=>'张三','age'=>20]);
// 更新
db('user')->where('id',1)->update(['name'=>'李四']);
// 删除 1不显示 2彻底删除
db('user')->where('id',1)->delete();
模型(app/index/model/User.php)
javascript
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $table = 'user';
}
// 使用
$user = User::find(1);
$user->name = '张三';
$user->save();
常用命令
javascript
# 启动内置服务器
php think run
# 生成控制器/模型
php think make:controller index/User
php think make:model index/User
# 数据库迁移
php think migrate:run
php think migrate:rollback
学习路径(新手必看)
- 安装 → 目录结构 → 入口文件
- 路由 → 控制器 → 请求 / 响应
- 数据库(Db)→ 模型(ORM)
- 视图(模板)→ 验证 → 上传
- Session/Cookie → 缓存 → 中间件
laravel
看开发手册laravel: laravel开发手册.
- 下载laravel框架
Laravel 核心目录
javascript
//plaintext
my-app/
├── app/ # 核心代码(控制器、模型、服务)
├── bootstrap/ # 框架启动
├── config/ # 所有配置(数据库、缓存、队列)
├── database/ # 迁移、种子、工厂
├── public/ # 入口 index.php、静态资源
├── resources/ # 视图(blade)、语言、前端资源
├── routes/ # 路由(web.php、api.php)
├── storage/ # 日志、缓存、上传文件
└── vendor/ # Composer 依赖
常用功能速查(手册核心)
- 路由(routes/web.php、api.php)
javascript
//PHP
// GET
Route::get('/user', [UserController::class, 'index']);
// POST、PUT、DELETE
Route::post('/user', [UserController::class, 'store']);
Route::put('/user/{id}', [UserController::class, 'update']);
Route::delete('/user/{id}', [UserController::class, 'destroy']);
// 资源路由(7大标准接口)
Route::resource('posts', PostController::class);
- 控制器(app/Http/Controllers)
javascript
//PHP
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
$users = User::all();
return view('user.index', compact('users'));
}
public function store(Request $request)
{
// 验证
$validated = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
]);
// 创建
User::create($validated);
return redirect('/users');
}
}
- 请求 / 响应(对应 GET_POST、$_FILES)
javascript
//php
// 获取 GET/POST 参数
$name = $request->input('name');
$all = $request->all();
// 文件上传
if ($request->hasFile('avatar')) {
$path = $request->file('avatar')->store('avatars');
}
// 返回 JSON
return response()->json(['data' => $users]);
// 视图
return view('user.show', ['user' => $user]);
- ** Eloquent ORM(数据库)**
javascript
//php
// 查询
$user = User::find(1);
$users = User::where('age', '>', 18)->get();
// 新增
$user = new User;
$user->name = '张三';
$user->save();
// 或
User::create(['name' => '张三']);
// 更新
$user->update(['name' => '李四']);
// 删除
$user->delete();
- 会话 / Cookie(SESSION、_COOKIE)
javascript
// Session
session(['key' => 'value']);
$value = session('key');
// Cookie
Cookie::queue('name', 'value', 60);
$value = $request->cookie('name');
- 数据库迁移(Migration)
javascript
//bash
# 创建迁移
php artisan make:migration create_posts_table
# 运行迁移
php artisan migrate
# 回滚
php artisan migrate:rollback
- 常用 Artisan 命令
javascript
//bash
php artisan serve # 启动服务(http://127.0.0.1:8000)
php artisan make:controller # 新建控制器
php artisan make:model # 新建模型
php artisan make:middleware # 新建中间件
php artisan tinker # 交互式命令行
php artisan route:list # 查看路由列表
Laravel 最核心的 3 个东西(必须懂)
① 路由(Route)
- 用户访问网址 → 交给哪个方法处理
javascript
//php
Route::get('/user', [UserController::class, 'index']);
② 控制器(Controller)
- 处理逻辑、查数据库、返回页面
javascript
//php
public function index() {
return view('user', ['name' => '小明']);
}
③ 视图(View)
- 前端 HTML 页面,展示数据
javascript
//blade
你好 {{ $name }}
最简单运行流程(秒懂)
- 浏览器访问 /user
- 路由找到控制器
- 控制器查数据库 / 处理逻辑
- 控制器返回视图
- 浏览器看到页面
例子:
- 路由 routes/web.php
javascript
//php
Route::get('/hello', function () {
return 'Hello Laravel!';
});
- 访问
javascript
//plaintext
http://你的域名/hello
- 结果
javascript
//plaintext
Hello Laravel!
tp5
PHP 原生最经典结构(真实项目结构)
| /index.php | 入口文件 |
|---|---|
| /config.php | 数据库配置 |
| /function.php | 公共函数 |
| /list.php | 列表页 |
| /detail.php | 详情页 |
| /admin/ | 后台 |
所有页面都是独立的 .php 文件
浏览器访问哪个,服务器就执行哪个。
原生 PHP 运行原理(超级重要)
- 底层执行流程 (Apache + PHP)
浏览器请求 http://xxx.com/index.php - Apache 收到请求
- Apache 发现后缀是 .php
- 交给 PHP 解释器 执行
- PHP 逐行解析代码:
- 连接数据库
- 查询数据
- 拼接 HTML
- 执行完,生成纯 HTML
- 返回给 Apache → 浏览器显示页面
一句话原理,PHP 是脚本语言,请求一次,执行一次,执行完就销毁。
无状态、无内存常驻(除了缓存)。
原生 PHP 最标准写法(你必须会)
- 数据库连接(原生 mysqli)
PHP
javascript
// 连接
$conn = mysqli_connect('localhost', 'root', 'root', 'test');
// 设置编码
mysqli_set_charset($conn, 'utf8');
// 判断是否连接成功
if (!$conn) {
die('连接失败');
}
原理
- PHP 调用 MySQL 客户端协议
- 建立 TCP 连接
- 发送账号密码验证
- 成功后保持连接,直到页面执行完毕关闭
查询数据(原生写法)
PHP
javascript
$sql = "SELECT * FROM user WHERE id = 1";
$result = mysqli_query($conn, $sql);
$user = mysqli_fetch_assoc($result);
原理
- 发送 SQL 字符串到 MySQL
- MySQL 解析、执行、返回结果集
- PHP 接收结果集,转成数组
- 用完释放内存
输出 HTML(原生最经典写法)
PHP
javascript
<!DOCTYPE html>
<html>
<head>
<title>用户</title>
</head>
<body>
<h1> <?php echo $user['username']; ?> </h1>
<p> <?php echo $user['email']; ?> </p>
</body>
</html>
原理
- PHP 代码在服务器执行
- 所有 标签都会被替换成真实内容
- 最终浏览器只收到纯 HTML,看不到 PHP 代码
表单提交(原生 POST)
PHP
javascript
if ($_POST) {
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "INSERT INTO user(username,password) VALUES('$username','$password')";
mysqli_query($conn, $sql);
}
原理
- 浏览器 POST 数据 → Apache → PHP
- PHP 自动把数据放进超全局数组 $_POST
- 你直接取出来用
PHP 原生底层核心特点(面试必问)
- 超全局变量(底层自动生成)
PHP
javascript
$_GET 地址栏传参
$_POST 表单提交
$_SESSION 浏览器持久存储
$_COOKIE 服务器临时会话
$_SERVER 请求 / 服务器信息
$_FILES 文件上传
| $_GET | 地址栏看得见 |
|---|---|
| $_POST | 表单悄悄传 |
| $_COOKIE | 浏览器存着 |
| $_SESSION | 服务器存着 |
| $_SERVER | 请求 / IP / 地址信息 |
| $_FILES | 文件上传专用 |
实例
$_GET
作用: 接收地址栏上的参数
- 数据在 URL 里显示
- 用于查询、分页、跳转传参
例子:
javascript
//plaintext
http://xxx.com/index.php?id=1&name=张三
使用:
javascript
//PHP
echo $_GET['id']; // 1
echo $_GET['name']; // 张三
$_POST
作用:接收表单提交的数据
- 数据不显示在 URL
- 用于登录、注册、提交内容
表单:
javascript
//html
<form method="post">
<input name="username">
</form>
使用:
javascript
//PHP
echo $_POST['username'];
$_COOKIE
作用:读取浏览器本地存储的小数据
- 数据存在用户电脑上
- 可设置过期时间(几天、几月都可以)
- 常用于:记住用户名、自动登录、跟踪用户
设置:
javascript
//PHP
setcookie('user', 'zhangsan', time() + 3600);
读取:
javascript
echo $_COOKIE['user'];
$_SESSION
作用:服务器端会话数据,临时保存用户信息
- 数据存在服务器
- 浏览器关闭即失效
- 常用于:登录状态、验证码、购物车临时数据
必须先开启:
javascript
//PHP
session_start();
存值:
javascript
//PHP
$_SESSION['user_id'] = 1001;
取值:
javascript
//PHP
echo $_SESSION['user_id'];
$_SERVER
作用:获取当前请求、服务器、客户端的信息
最常用的:
javascript
//PHP
$_SERVER['REQUEST_METHOD'] // GET 或 POST
$_SERVER['REQUEST_URI'] // 当前访问的地址如 /index.php
$_SERVER['REMOTE_ADDR'] // 用户的 IP 地址
$_SERVER['HTTP_USER_AGENT'] // 浏览器/设备信息
$_SERVER['HTTP_REFERER'] // 从哪个页面跳转过来
$_FILES
作用:接收上传的文件(图片、文档等)
- 必须配合表单:enctype="multipart/form-data"
- 保存文件临时信息,用于移动到项目目录
使用:
javascript
//PHP
// 文件名
$_FILES['avatar']['name'];
// 临时文件路径
$_FILES['avatar']['tmp_name'];
// 文件大小
$_FILES['avatar']['size'];
原生 PHP 和框架的底层区别(重点)
原生 PHP
- 每个 PHP 文件独立运行
- 自己写数据库、自己写 HTML、自己写安全
- 流程简单直接
- 适合小项目、快速开发
框架(Laravel/TP)
- 统一入口 index.php
- 加载路由、控制器、模型、容器
- 自动加载、依赖注入、中间件
- 代码更规范、安全、强大
- 底层更复杂,但开发更快
一句话:
框架 = 把原生重复代码全部封装好了,你只写业务。
完整可运行的原生 PHP 示例
PHP
javascript
<?php
// 1. 连接数据库
$conn = mysqli_connect('127.0.0.1', 'root', 'root', 'test');
mysqli_set_charset($conn, 'utf8');
// 2. 查询
$sql = "SELECT * FROM user LIMIT 1";
$result = mysqli_query($conn, $sql);
$user = mysqli_fetch_assoc($result);
?>
<!-- 3. 输出 HTML -->
<h1>用户名:<?php echo $user['username'] ?></h1>
<p>邮箱:<?php echo $user['email'] ?></p>
- 这就是最真实、最底层的 PHP。
解释你选中的这行代码:
javascript
$result = mysqli_query($conn, $sql);
这行代码的作用
向 MySQL 数据库发送 SQL 语句,并执行它,把执行结果保存起来。
逐部分拆解
1.mysqli_query()
PHP 自带的原生数据库执行函数
作用:发送 SQL 命令给 MySQL
专门用来执行查询、新增、修改、删除
- $conn
数据库连接对象
代表当前已经建立好的 MySQL 连接
没有它,PHP 不知道把 SQL 发给谁
- $sql
你写好的 SQL 语句
例子:SELECT * FROM user WHERE id = 1
- $result
把MySQL 返回的结果集 存到变量 $result 里
它不是最终数据,而是查询结果资源
底层原理(非常重要)
- PHP 通过 $conn连接通道
- 把$sql语句发送给 MySQL 服务器
- MySQL 执行这条 SQL
- MySQL 把查询结果返回给 PHP
- PHP 把结果保存到 $result 中,等待下一步处理
PHP 最常用、常被称作三种输出方式一般是指这三个:
- echo
javascript
//php
echo 'Hello', ' World';
- 最常用,速度最快
- 可以输出多个字符串,用逗号分隔
- 没有返回值
- 只能输出一个字符串
- 有返回值(永远返回 1)
- 用法和 echo 差不多,但效率略低
javascript
//php
print 'Hello World';
- print_r()
- 用来打印数组、对象等复杂结构
- 适合调试看数据结构
- 第二个参数设为 true 可以返回字符串而不直接输出
javascript
//php
$arr = ['a', 'b', 'c'];
print_r($arr);
打印类型
- var_dump() 打印类型 + 值,调试最强
- printf():格式化输出(类似 C 语言)
Apache + PHP 运行原理
Apache(HTTP 服务器)
- 监听 80/443 端口
- 接收浏览器发来的 HTTP 请求
- 判断请求的是:静态文件(html/css/js/png)还是 PHP 文件
- 静态文件直接返回
- PHP 文件就交给 PHP 解释器去执行
PHP(脚本解释器)
- 不直接对外接收请求
- 只负责:解析 PHP 代码 → 连接数据库 → 运算 → 生成 HTML
- 把结果返回给 Apache
- Apache 再把结果发给浏览器
运行流程(最核心)
- 浏览器输入网址 → 发送 HTTP 请求到服务器 80 端口
- Apache 收到请求
- Apache 看后缀:
- .html/.jpg → 直接读取文件返回
- .php → 把请求转发给 PHP 处理
- PHP 执行代码:
- 读取 index.php
- 执行 echo、数据库查询、逻辑运算
- 输出一段纯 HTML
- PHP 把结果返回给 Apache
- Apache 把 HTML 发给浏览器
- 浏览器渲染显示页面
Apache 和 PHP 怎么 "连" 在一起的?
两种常见模式:
① 模块化模式(mod_php)
- PHP 作为 Apache 的一个模块加载
- Apache 启动时,PHP 也跟着启动
- 优点:快、配置简单(小皮面板默认就是这种)
- 缺点:每个请求都会占用 Apache 进程
② FPM 模式(php-fpm) - PHP 独立运行在后台(php-fpm 进程)
- Apache 通过反向代理把请求转给 PHP-FPM
- 优点:稳定、高并发、资源隔离
- 企业生产环境主流
最简单类比
- Apache = 饭店前台
接客、指路、端菜出去 - PHP = 后厨厨师
- 只负责做菜(执行代码、查数据库)
- 浏览器 = 顾客
顾客点菜 → 前台转给后厨 → 后厨做好菜 → 前台端给顾客
配置层面一句话原理
Apache 里有配置:
javascript
//plaintext
AddHandler application/x-httpd-php .php
意思就是:凡是 .php 结尾的请求,都交给 PHP 引擎处理。