
第一章认识 PHP:起源、特点与应用场景
1.1 PHP 的发展历程
PHP(Hypertext Preprocessor,超文本预处理器)最初由 Rasmus Lerdorf 于 1994 年创建,最初名为 “Personal Home Page Tools”,仅用于处理个人网页表单数据。历经多个版本迭代,目前稳定版为 PHP 8.3,新增了 JIT 编译器、联合类型、match 表达式等特性,性能与灵活性大幅提升。
1.2 PHP 的核心特点
•跨平台性:可运行于 Windows、Linux、macOS 等系统,支持 Apache、Nginx、IIS 等主流 Web 服务器。
•脚本语言特性:无需编译,直接由服务器解析执行,开发效率高。
•强大的数据库支持:原生支持 MySQL、PostgreSQL、MongoDB 等 20 + 数据库,通过 PDO 扩展可实现数据库操作的统一接口。
•嵌入式语法:可直接嵌入 HTML 代码中,如<?php echo "Hello PHP"; ?>,降低前后端衔接成本。
•开源免费:基于 MIT 协议,可自由修改源码,拥有庞大的社区生态。
1.3 PHP 的应用场景
•动态网站开发(如博客、电商平台、CMS 系统);
•接口开发(为 App、小程序提供数据接口);
•命令行脚本(批量处理数据、定时任务);
•企业级应用(结合框架如 Laravel、ThinkPHP 构建复杂系统)。

第二章 PHP 环境搭建:本地开发与服务器部署
2.1 本地开发环境搭建(Windows/macOS/Linux)
2.1.1 集成环境方案(新手推荐)
•XAMPP:包含 Apache、MySQL、PHP、PhpMyAdmin,一键安装。
◦下载地址:https://www.apachefriends.org/
◦配置步骤:
i.运行安装程序,选择安装路径(避免中文路径);
ii.启动 Apache 和 MySQL 服务(若端口冲突,修改 Apache 的 80 端口或 MySQL 的 3306 端口);
iii.访问http://localhost,出现 XAMPP 欢迎页即搭建成功。
•WAMP(Windows 专属):功能与 XAMPP 类似,优化了 Windows 系统兼容性。
2.1.2 手动搭建环境(进阶学习)
以 Linux(Ubuntu 22.04)为例:
1.安装 Apache:sudo apt install apache2,启动服务sudo systemctl start apache2;
2.安装 PHP:sudo apt install php8.3 php8.3-mysql php8.3-curl(安装核心扩展);
3.安装 MySQL:sudo apt install mysql-server,初始化配置sudo mysql_secure_installation;
4.验证环境:创建/var/www/html/test.php,写入<?php phpinfo(); ?>,访问http://服务器IP/test.php,显示 PHP 信息即成功。
2.2 服务器部署(以 Linux+Nginx 为例)
1.安装 Nginx:sudo apt install nginx;
2.配置 Nginx 支持 PHP:修改/etc/nginx/sites-available/default,添加 PHP 解析规则:
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } |
1.重启服务:sudo systemctl restart nginx php8.3-fpm;
2.上传代码:将本地 PHP 项目文件上传至/var/www/html目录,设置权限sudo chmod -R 755 /var/www/html。
第三章 PHP 基础语法:变量、数据类型与流程控制
3.1 变量与数据类型
3.1.1 变量声明
PHP 变量以$开头,无需声明类型,动态赋值:
$name = "张三"; // 字符串 $age = 25; // 整数 $score = 92.5; // 浮点数 $isStudent = true; // 布尔值 $hobbies = ["篮球", "编程"]; // 数组 $user = null; // 空值 |
3.1.2 常用数据类型操作
•字符串拼接:echo "姓名:" . $name . ",年龄:" . $age;(输出:姓名:张三,年龄:25);
•数组遍历:
// foreach遍历索引数组 foreach ($hobbies as $hobby) { echo $hobby . " "; // 输出:篮球 编程 } // 关联数组 $userInfo = ["name" => "李四", "age" => 30]; echo $userInfo["name"]; // 输出:李四 |
3.2 运算符与表达式
3.2.1 常用运算符
•算术运算符:+-*/%(取余),如$sum = 10 + 5;($sum=15);
•比较运算符:==(值相等)、===(值和类型都相等)、!=、>、<,如10 == "10"为 true,10 === "10"为 false;
•逻辑运算符:&&(与)、||(或)、!(非),如$isAdult = $age >= 18 && $age <= 60;。
3.3 流程控制语句
3.3.1 条件语句
// if-else if ($age < 18) { echo "未成年"; } elseif ($age >= 18 && $age < 30) { echo "青年"; } else { echo "成年"; } // switch switch ($age) { case 20: echo "20岁"; break; case 25: echo "25岁"; break; default: echo "其他年龄"; } |
3.3.2 循环语句
// for循环 for ($i = 1; $i <= 5; $i++) { echo "循环第" . $i . "次<br>"; } // while循环 $num = 1; while ($num <= 3) { echo "数字:" . $num . "<br>"; $num++; } // do-while循环(至少执行一次) $count = 0; do { echo "计数:" . $count . "<br>"; $count++; } while ($count < 2); |

第四章 PHP 函数:内置函数与自定义函数
4.1 常用内置函数
4.1.1 字符串函数
•strlen($str):获取字符串长度,如strlen("PHP")返回 3;
•str_replace($search, $replace, $str):替换字符串,如str_replace("PHP", "Java", "我爱PHP")返回“我爱 Java”;
•explode($delimiter, $str):分割字符串为数组,如explode(",", "苹果,香蕉,橙子")返回 ["苹果","香蕉","橙子"]。
4.1.2 数组函数
•count($arr):获取数组长度,如count($hobbies)返回 2;
•array_push($arr, $value):向数组末尾添加元素,如array_push($hobbies, "阅读")后,$hobbies 变为 ["篮球","编程","阅读"];
•array_merge($arr1, $arr2):合并数组,如array_merge([1,2], [3,4])返回 [1,2,3,4]。
4.2 自定义函数
4.2.1 基本函数定义与调用
// 定义函数:计算两数之和 function add($a, $b) { return $a + $b; } // 调用函数 $result = add(10, 20); echo $result; // 输出:30 |
4.2.2 函数参数进阶
•默认参数:
function getInfo($name, $age = 18) { // age默认值18 echo "姓名:" . $name . ",年龄:" . $age; } getInfo("王五"); // 输出:姓名:王五,年龄:18 |
•引用参数(通过&传递变量地址):
function increment(&$num) { $num++; } $x = 5; increment($x); echo $x; // 输出:6($x的值被修改) |
第五章 PHP 面向对象编程(OOP):从概念到实战
5.1 OOP 核心概念
•类:对象的模板,定义属性(变量)和方法(函数);
•对象:类的实例,通过new关键字创建;
•封装:隐藏类的内部实现,通过访问修饰符(public、private、protected)控制属性 / 方法访问权限;
•继承:子类继承父类的属性和方法,可重写父类方法;
•多态:不同类的对象对同一方法有不同实现。
5.2 类与对象的创建
// 定义User类 class User { // 公共属性(外部可访问) public $name; // 私有属性(仅类内部可访问) private $age; // 构造方法(创建对象时自动调用) public function __construct($name, $age) { $this->name = $name; // $this表示当前对象 $this->age = $age; } // 公共方法:获取年龄(私有属性通过方法访问) public function getAge() { return $this->age; } // 公共方法:修改年龄 public function setAge($newAge) { if ($newAge > 0 && $newAge < 150) { $this->age = $newAge; } } // 公共方法:输出用户信息 public function showInfo() { echo "姓名:" . $this->name . ",年龄:" . $this->age; } } // 创建User对象 $user1 = new User("赵六", 28); // 访问属性和方法 echo $user1->name; // 输出:赵六 $user1->setAge(29); $user1->showInfo(); // 输出:姓名:赵六,年龄:29 |
5.3 继承与多态
// 定义子类Admin(继承User类) class Admin extends User { // 新增属性 public $role; // 重写构造方法(调用父类构造方法用parent::__construct()) public function __construct($name, $age, $role) { parent::__construct($name, $age); $this->role = $role; } // 重写父类showInfo方法(多态体现) public function showInfo() { echo "管理员姓名:" . $this->name . ",年龄:" . $this->getAge() . ",角色:" . $this->role; } // 新增方法:管理员权限 public function manage() { echo $this->name . "拥有系统管理权限"; } } // 创建Admin对象 $admin1 = new Admin("钱七", 35, "超级管理员"); $admin1->showInfo(); // 输出:管理员姓名:钱七,年龄:35,角色:超级管理员 $admin1->manage(); // 输出:钱七拥有系统管理权限 |
第六章 PHP 数据库操作:PDO 与 MySQLi
6.1 数据库连接(以 MySQL 为例)
6.1.1 PDO 连接(推荐,支持多数据库)
try { // 连接数据库(DSN格式:数据库类型:host=主机;dbname=数据库名;charset=编码) $pdo = new PDO("mysql:host=localhost;dbname=test_db;charset=utf8mb4", "root", "123456"); // 设置错误模式为抛出异常(便于调试) $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "PDO连接成功"; } catch (PDOException $e) { die("连接失败:" . $e->getMessage()); } |
6.1.2 MySQLi 连接(仅支持 MySQL)
// 面向对象方式 $mysqli = new mysqli("localhost", "root", "123456", "test_db"); if ($mysqli->connect_error) { die("连接失败:" . $mysqli->connect_error); } $mysqli->set_charset("utf8mb4"); echo "MySQLi连接成功"; // 关闭连接(PDO和MySQLi均会自动关闭,也可手动关闭) $mysqli->close(); $pdo = null; |
6.2 数据库 CRUD 操作(PDO 实现)
6.2.1 插入数据(预处理语句防 SQL 注入)
// 预处理SQL(:name为占位符) $stmt = $pdo->prepare("INSERT INTO users (name, age, email) VALUES (:name, :age, :email)"); // 绑定参数 $stmt->bindParam(":name", $name); $stmt->bindParam(":age", $age); $stmt->bindParam(":email", $email); // 赋值并执行 $name = "孙八"; $age = 22; $email = "sun8@example.com"; $stmt->execute(); // 获取插入的自增ID $insertId = $pdo->lastInsertId(); echo "插入成功,用户ID:" . $insertId; |
6.2.2 查询数据
// 查询单条数据 $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(["id" => 1]); $user = $stmt->fetch(PDO::FETCH_ASSOC); // 返回关联数组 echo "用户姓名:" . $user["name"]; // 查询多条数据 $stmt = $pdo->query("SELECT * FROM users WHERE age > 20"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($users as $u) { echo "ID:" . $u["id"] . ",姓名:" . $u["name"] . "<br>"; } |
6.2.3 更新与删除数据
// 更新数据 $stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id"); $stmt->execute(["age" => 23, "id" => 1]); echo "更新成功,影响行数:" . $stmt->rowCount(); // 删除数据 $stmt = $pdo->prepare("DELETE FROM users WHERE id = :id"); $stmt->execute(["id" => 2]); echo "删除成功,影响行数:" . $stmt->rowCount(); |
第七章 PHP Web 开发核心:超全局变量与会话管理
7.1 超全局变量(预定义数组,无需声明即可使用)
7.1.1 常用超全局变量
•$_GET:获取 URL 参数(如http://xxx.com?name=张三,$_GET["name"]获取“张三”);
•$_POST:获取表单 POST 提交数据(如表单method="post"时,$_POST["username"]获取用户名);
•$_SESSION:会话变量,存储用户登录状态等临时数据;
•$_COOKIE:Cookie 变量,存储客户端浏览器数据;
•$_SERVER:服务器信息,如$_SERVER["PHP_SELF"]获取当前脚本路径,$_SERVER["REMOTE_ADDR"]获取客户端 IP。
7.1.2 实例:表单提交处理
<!-- form.html(表单页面) --> <form action="handle_form.php" method="post"> 用户名:<input type="text" name="username" required><br> 密码:<input type="password" name="password" required><br> <button type="submit">提交</button> </form> |
<!-- handle_form.php(处理页面) --> <?php // 获取表单数据 $username = $_POST["username"]; $password = $_POST["password"]; // 实际开发中需加密存储,如password_hash() // 简单验证 if ($username === "admin" && $password === "admin123") { echo "登录成功,欢迎" . $username; } else { echo "用户名或密码错误"; } ?> |
7.2 会话管理(Session)
7.2.1 Session 的开启与使用
// 开启Session(必须放在脚本最顶部,无输出前) session_start(); // 设置Session变量 $_SESSION["username"] = "admin"; $_SESSION["isLogin"] = true; // 读取Session变量 if ($_SESSION["isLogin"]) { echo "当前登录用户:" . $_SESSION["username"]; } // 销毁Session // 方式1:删除单个Session变量 unset($_SESSION["username"]); // 方式2:清空所有Session变量 $_SESSION = []; // 方式3:销毁Session(彻底删除Session文件) session_destroy(); |
7.2.2 Cookie 的使用
// 设置Cookie(参数:名称、值、过期时间(秒)、路径、域名、是否HTTPS传输) setcookie("user_token", "abc123xyz", time() + 3600, "/", "", false, true); // 最后一个参数true表示仅HTTP访问,防JS读取 // 读取Cookie if (isset($_COOKIE["user_token"])) { echo "Cookie值:" . $_COOKIE["user_token"]; } // 删除Cookie(设置过期时间为过去) setcookie("user_token", "", time() - 3600, "/"); |
第八章 PHP 实战项目:简易用户管理系统
8.1 项目需求与架构
•功能:用户注册、登录、列表展示、修改、删除;
•技术栈:PHP + MySQL + HTML + CSS(Bootstrap);
•架构:MVC 简化版(分视图、控制器,模型用 PDO 封装)。
8.2 数据库设计(users 表)
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `email` varchar(100) NOT NULL COMMENT '邮箱', `password` varchar(255) NOT NULL COMMENT '加密密码', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; |
8.3 核心功能实现(控制器示例)
8.3.1 用户注册(register.php)
<?php require_once "db.php"; // 引入数据库连接文件 session_start(); if ($_SERVER["REQUEST_METHOD"] === "POST") { $username = trim($_POST["username"]); $email = trim($_POST["email"]); $password = $_POST["password"]; $confirmPwd = $_POST["confirm_password"]; // 表单验证 $errors = []; if (empty($username)) $errors[] = "用户名不能为空"; if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "邮箱格式错误"; if (strlen($password) < 6) $errors[] = "密码至少6位"; if ($password !== $confirmPwd) $errors[] = "两次密码不一致"; // 验证用户名/邮箱是否已存在 $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username OR email = :email"); $stmt->execute(["username" => $username, "email" => $email]); if ($stmt->rowCount() > 0) $errors[] = "用户名或邮箱已被注册"; if (empty($errors)) { // 密码加密(password_hash()生成哈希值,password_verify()验证) $hashedPwd = password_hash($password, PASSWORD_DEFAULT); // 插入数据 $stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)"); $stmt->execute([ "username" => $username, "email" => $email, "password" => $hashedPwd ]); $_SESSION["success"] = "注册成功,请登录"; header("Location: login.php"); // 跳转到登录页 exit; } else { $_SESSION["errors"] = $errors; } } ?> <!-- 注册表单视图 --> <!DOCTYPE html> <html> <head> <title>用户注册</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> </head> <body> <div class="container mt-5"> <h2>用户注册</h2> <!-- 显示错误信息 --> <?php if (isset($_SESSION["errors"])): ?> <div class="alert alert-danger"> <?php foreach ($_SESSION["errors"] as $error): ?> <p><?php echo $error ?></p> <?php endforeach; unset($_SESSION["errors"]); ?> </div> <?php endif; ?> <form method="post"> <div class="mb-3"> <label>用户名</label> <input type="text" name="username" class="form-control" required> </div> <div class="mb-3"> <label>邮箱</label> <input type="email" name="email" class="form-control" required> </div> <div class="mb-3"> <label>密码</label> <input type="password" name="password" class="form-control" required> </div> <div class="mb-3"> <label>确认密码</label> <input type="password" name="confirm_password" class="form-control" required> </div> <button type="submit" class="btn btn-primary">注册</button> <a href="login.php" class="btn btn-link">已有账号?登录</a> </form> </div> </body> </html> |
8.3.2 用户登录与列表展示(核心代码)
// login.php(登录逻辑) session_start(); require_once "db.php"; if ($_SERVER["REQUEST_METHOD"] === "POST") { $username = $_POST["username"]; $password = $_POST["password"]; // 查询用户 $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(["username" => $username]); $user = $stmt->fetch(PDO::FETCH_ASSOC); // 验证密码 if ($user && password_verify($password, $user["password"])) { $_SESSION["user"] = $user; // 存储用户信息到Session header("Location: user_list.php"); exit; } else { $_SESSION["error"] = "用户名或密码错误"; } } // user_list.php(用户列表,需登录才能访问) session_start(); // 未登录则跳转到登录页 if (!isset($_SESSION["user"])) { header("Location: login.php"); exit; } require_once "db.php"; // 查询所有用户 $stmt = $pdo->query("SELECT id, username, email, create_time FROM users ORDER BY create_time DESC"); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); |
第九章 PHP 性能优化与安全防护
9.1 性能优化技巧
9.1.1 代码层面优化
•减少全局变量使用:全局变量会增加内存消耗,优先用局部变量或类属性;
•优化循环:避免在循环内执行函数调用或复杂计算,如for ($i = 0, $len = count($arr); $i < $len; $i++)(提前计算数组长度);
•使用缓存:频繁访问的数据(如配置信息)用apc_cache或Redis缓存,减少数据库查询;
•开启 PHP opcode 缓存:如OPcache(PHP 5.5 + 内置),编译后的 PHP 代码缓存到内存,避免重复编译,配置示例(php.ini):
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 |
9.1.2 数据库优化
•合理建立索引:对查询条件中的字段(如 WHERE、ORDER BY 后的字段)建立索引;
•避免 SELECT *:只查询需要的字段,减少数据传输量;
•使用数据库连接池:减少频繁创建 / 关闭数据库连接的开销(如用Swoole实现连接池)。
9.2 安全防护措施
9.2.1 防 SQL 注入
•必用预处理语句(PDO 或 MySQLi 的 prepare ()),避免直接拼接 SQL;
•过滤用户输入:用filter_var()过滤邮箱、IP 等,如filter_var($email, FILTER_VALIDATE_EMAIL)。
9.2.2 防 XSS 攻击(跨站脚本攻击)
•输出数据时转义:用htmlspecialchars()将特殊字符(<、>、"、' 等)转义为 HTML 实体,如echo htmlspecialchars($userInput, ENT_QUOTES);;
•设置 Cookie 的HttpOnly和Secure属性:setcookie("token", "xxx", time()+3600, "/", "", true, true);(HttpOnly防 JS 读取 Cookie,Secure仅 HTTPS 传输)。
9.2.3 防 CSRF 攻击(跨站请求伪造)
•生成 CSRF Token:每次表单提交时附带随机 Token,验证 Token 有效性,示例:
// 生成Token并存储到Session $_SESSION["csrf_token"] = bin2hex(random_bytes(32)); // 表单中添加Token <input type="hidden" name="csrf_token" value="<?php echo $_SESSION["csrf_token"]; ?>"> // 验证Token if ($_POST["csrf_token"] !== $_SESSION["csrf_token"]) { die("CSRF攻击检测:Token验证失败"); } |
第十章 PHP 进阶方向与学习资源
10.1 进阶方向
•PHP 框架学习:Laravel(优雅的企业级框架,支持 RESTful API、ORM)、ThinkPHP(国内流行,中文文档丰富)、Yii(高性能,适合大型项目);
•接口开发:RESTful API 设计(用 Laravel 的 Passport 实现 OAuth2.0 认证)、GraphQL(按需获取数据,减少接口请求次数);
•高性能编程:Swoole(PHP 协程框架,支持异步 IO、WebSocket,适合开发高并发系统如聊天、直播);
•DevOps 工具链:Docker 部署 PHP 项目、CI/CD(Jenkins 自动化构建测试)。
10.2 推荐学习资源
•官方文档:PHP 官方手册(最权威,包含所有函数与特性);
•书籍:《PHP 和 MySQL Web 开发(第 5 版)》、《Laravel 实战》、《深入理解 PHP 内核》;
•在线课程:Laracasts(Laravel 官方推荐,英文)、慕课网 / 极客时间的 PHP 进阶课程(中文);
•社区与工具:Stack Overflow(解决问题)、PHPStan(静态代码分析)、PHPUnit(单元测试)。