教学PHP

PHP

第一个查看PHP环境

  1. 先配置环境,win+r
  2. 然后cmd
  3. 输入:
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环境

  1. 小皮面板(phpStudy)一键安装 Apache(最推荐),直接在小皮里下载安装 Apache 即可:
  2. 打开小皮面板 → 软件管理
  3. 找到 Apache → 点击 安装
    选择 Apache 2.4.x 稳定版(如 2.4.57)。
  4. 安装完成后 → 首页 启动 Apache

解释一下 wnmp

WNMP 解释
W win系统
N nginx (高性能的 Web 服务器)
M MySQL (数据库)
P php (编程语言)

区别

Laravel 底层

  1. 全容器化、全依赖注入、全服务提供者、全中间件管道
  2. 高度解耦、扩展性极强、适合大型复杂项目、长期维护
  3. 代码优雅、学习曲线较陡、生态极丰富

TP5 底层

  1. 轻量容器、混合调用(全局函数 + DI)、流程直接
  2. 快速上手、开发高效、性能好、适合中小型项目、快速迭代
  3. 中文友好、配置灵活、自动映射友好

下载框架

tp5

看开发手册tp5: tp5开发手册.

  1. 下载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 写法)

  1. 获取 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(); // 所有参数
  1. Session(会话)
javascript 复制代码
// 助手函数
session('user', '张三');    // 设置 $_SESSION['user']
session('user');            // 获取
session('user', null);      // 删除

// 对象方式
use think\Session;
Session::set('name', 'Tom');
Session::get('name');
  1. Cookie
javascript 复制代码
// 助手函数
cookie('name', 'value', 3600); // 保存1小时
cookie('name');                // 获取
cookie('name', null);          // 删除

// 对象方式
use think\Cookie;
Cookie::set('id', 100, 3600);
  1. $_SERVER 信息
javascript 复制代码
input('server.REQUEST_METHOD'); // 请求方式
input('server.REQUEST_URI');    // 当前URL
input('server.HTTP_USER_AGENT');// 浏览器信息
  1. 文件上传($_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

学习路径(新手必看)

  1. 安装 → 目录结构 → 入口文件
  2. 路由 → 控制器 → 请求 / 响应
  3. 数据库(Db)→ 模型(ORM)
  4. 视图(模板)→ 验证 → 上传
  5. Session/Cookie → 缓存 → 中间件

laravel

看开发手册laravel: laravel开发手册.

  1. 下载laravel框架

Laravel 核心目录

javascript 复制代码
//plaintext
my-app/
├── app/            # 核心代码(控制器、模型、服务)
├── bootstrap/      # 框架启动
├── config/         # 所有配置(数据库、缓存、队列)
├── database/       # 迁移、种子、工厂
├── public/         # 入口 index.php、静态资源
├── resources/      # 视图(blade)、语言、前端资源
├── routes/         # 路由(web.php、api.php)
├── storage/        # 日志、缓存、上传文件
└── vendor/         # Composer 依赖

常用功能速查(手册核心)

  1. 路由(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);
  1. 控制器(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');
    }
}
  1. 请求 / 响应(对应 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]);
  1. ** 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();
  1. 会话 / Cookie(SESSION、_COOKIE)
javascript 复制代码
// Session
session(['key' => 'value']);
$value = session('key');

// Cookie
Cookie::queue('name', 'value', 60);
$value = $request->cookie('name');
  1. 数据库迁移(Migration)
javascript 复制代码
//bash
# 创建迁移
php artisan make:migration create_posts_table

# 运行迁移
php artisan migrate

# 回滚
php artisan migrate:rollback
  1. 常用 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 }}

最简单运行流程(秒懂)

  1. 浏览器访问 /user
  2. 路由找到控制器
  3. 控制器查数据库 / 处理逻辑
  4. 控制器返回视图
  5. 浏览器看到页面

例子:

  1. 路由 routes/web.php
javascript 复制代码
//php
Route::get('/hello', function () {
    return 'Hello Laravel!';
});
  1. 访问
javascript 复制代码
//plaintext
http://你的域名/hello
  1. 结果
javascript 复制代码
//plaintext
Hello Laravel!

tp5

PHP 原生最经典结构(真实项目结构)

/index.php 入口文件
/config.php 数据库配置
/function.php 公共函数
/list.php 列表页
/detail.php 详情页
/admin/ 后台

所有页面都是独立的 .php 文件

浏览器访问哪个,服务器就执行哪个。

原生 PHP 运行原理(超级重要)

  1. 底层执行流程 (Apache + PHP)
    浏览器请求 http://xxx.com/index.php
  2. Apache 收到请求
  3. Apache 发现后缀是 .php
  4. 交给 PHP 解释器 执行
  5. PHP 逐行解析代码:
  • 连接数据库
  • 查询数据
  • 拼接 HTML
  1. 执行完,生成纯 HTML
  2. 返回给 Apache → 浏览器显示页面
    一句话原理,PHP 是脚本语言,请求一次,执行一次,执行完就销毁。
    无状态、无内存常驻(除了缓存)。

原生 PHP 最标准写法(你必须会)

  1. 数据库连接(原生 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 原生底层核心特点(面试必问)

  1. 超全局变量(底层自动生成)

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'];

作用:读取浏览器本地存储的小数据

  • 数据存在用户电脑上
  • 可设置过期时间(几天、几月都可以)
  • 常用于:记住用户名、自动登录、跟踪用户

设置:

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

专门用来执行查询、新增、修改、删除

  1. $conn

数据库连接对象

代表当前已经建立好的 MySQL 连接

没有它,PHP 不知道把 SQL 发给谁

  1. $sql

你写好的 SQL 语句

例子:SELECT * FROM user WHERE id = 1

  1. $result

MySQL 返回的结果集 存到变量 $result 里

它不是最终数据,而是查询结果资源

底层原理(非常重要)

  1. PHP 通过 $conn连接通道
  2. 把$sql语句发送给 MySQL 服务器
  3. MySQL 执行这条 SQL
  4. MySQL 把查询结果返回给 PHP
  5. PHP 把结果保存到 $result 中,等待下一步处理

PHP 最常用、常被称作三种输出方式一般是指这三个:

  • echo
javascript 复制代码
//php
echo 'Hello', ' World';
  1. 最常用,速度最快
  2. 可以输出多个字符串,用逗号分隔
  3. 没有返回值
  • print
  1. 只能输出一个字符串
  2. 有返回值(永远返回 1)
  3. 用法和 echo 差不多,但效率略低
javascript 复制代码
//php
print 'Hello World';
  • print_r()
  1. 用来打印数组、对象等复杂结构
  2. 适合调试看数据结构
  3. 第二个参数设为 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 再把结果发给浏览器
运行流程(最核心)
  1. 浏览器输入网址 → 发送 HTTP 请求到服务器 80 端口
  2. Apache 收到请求
  3. Apache 看后缀:
  • .html/.jpg → 直接读取文件返回
  • .php → 把请求转发给 PHP 处理
  1. PHP 执行代码:
  • 读取 index.php
  • 执行 echo、数据库查询、逻辑运算
  • 输出一段纯 HTML
  1. PHP 把结果返回给 Apache
  2. Apache 把 HTML 发给浏览器
  3. 浏览器渲染显示页面
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 引擎处理。

相关推荐
架构师专栏2 小时前
比 MQ 更轻的异步方案:Spring 内置的这个隐藏功能,很多人还不知道
后端
林木882 小时前
Druid Kafka 数据源消费到 Segment 生成全链路深度分析
后端
charlie1145141912 小时前
嵌入式Linux模块开发——struct module 深度解析:内核模块的核心数据结构
linux·开发语言·数据结构·c
吴声子夜歌2 小时前
ES6——Symbol详解
开发语言·javascript·es6
摇曳的精灵2 小时前
Spring boot注解实现信息脱敏
java·spring boot·后端·注解脱敏·信息脱敏
星辰徐哥2 小时前
C语言运算符的优先级与结合性详解
c语言·开发语言
程序猿大帅2 小时前
记一次线上翻车:加了Redisson分布式锁,数据还是被并发打穿了
后端
weixin_704266052 小时前
项目总结一
java·前端·spring boot·后端·spring
HZ·湘怡2 小时前
顺序表 2 续集 c 实现增删查改
c语言·开发语言·顺序表
JimmtButler2 小时前
一台电脑,两个 Git 身份:公司 GitLab + 个人 GitHub 共存
后端