适用人群:零基础、想学后端开发的初学者
学习时长:约2-3天(每天4小时)
配套环境:PHP 8.x + Composer + 宝塔面板
发布平台:博客/抖音/B站
一、PHP 是什么?
PHP(PHP: Hypertext Preprocessor)是全球最流行的服务器端脚本语言之一。WordPress、Facebook、微信小程序后端都用PHP开发。
| 特点 | 说明 |
|---|---|
| 上手难度 | ★★☆☆☆(最易入门的后端语言之一) |
| 运行环境 | 服务器端执行,浏览器看到的是HTML结果 |
| 主要用途 | 网站开发、API接口、CMS系统、电商后台 |
| 市场需求 | 大量中小企业网站、WordPress生态、宝塔面板 |
| 薪资水平 | 初级8-15K,中级15-25K,高级25K+ |
二、环境搭建(5分钟搞定)
方案1:宝塔面板(推荐,生产环境)
# 1. 安装宝塔面板(CentOS)
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh
# 2. 宝塔面板安装后,一键安装LNMP环境
# - Nginx 1.24
# - PHP 8.2
# - MySQL 5.7 或 8.0
方案2:本地开发(Windows/macOS)
# 使用 phpstudy(小皮面板)一键安装
# 下载地址:https://www.xp.cn/
# 或者使用 Docker
docker run -d -p 8080:80 -v $(pwd):/var/www/html php:8.2-apache
方案3:命令行快速验证
# 安装PHP(macOS)
brew install php
# 安装PHP(Ubuntu)
sudo apt install php php-cli php-mysql php-curl php-mbstring php-xml php-zip
# 验证安装
php -v
# 输出:PHP 8.2.x (cli) ...
三、第一个PHP程序
3.1 Hello World
<?php
// hello.php
echo "Hello, PHP!";
echo "<h1>我的第一个PHP页面</h1>";
echo "<p>当前时间:" . date('Y-m-d H:i:s') . "</p>";
?>
运行方式:
# 命令行运行
php hello.php
# 或放到宝塔/www/wwwroot/your-site/目录下,浏览器访问
# http://your-domain/hello.php
3.2 PHP 基本语法
<?php
// ====================
// 1. 变量($开头)
// ====================
$name = "张三"; // 字符串
$age = 25; // 整数
$price = 99.9; // 浮点数
$isStudent = true; // 布尔值
$fruits = ["苹果", "香蕉", "橙子"]; // 数组
// ====================
// 2. 输出
// ====================
echo "姓名:$name"; // 简单输出
print_r($fruits); // 打印数组结构
var_dump($age); // 输出值和类型(调试用)
// ====================
// 3. 字符串操作
// ====================
$greeting = "你好," . $name . "!"; // 拼接用 .
$length = strlen($name); // 字符串长度
$upper = strtoupper("hello"); // 转大写:HELLO
$replace = str_replace("世界", "PHP", "你好,世界"); // 替换
// ====================
// 4. 条件判断
// ====================
if ($age >= 18) {
echo "$name 已成年";
} elseif ($age >= 12) {
echo "$name 是青少年";
} else {
echo "$name 是儿童";
}
// 三元运算符
$status = $age >= 18 ? "成年" : "未成年";
// ====================
// 5. 循环
// ====================
// for循环
for ($i = 1; $i <= 5; $i++) {
echo "第 $i 次<br>";
}
// foreach遍历数组
foreach ($fruits as $index => $fruit) {
echo "$index: $fruit<br>";
}
// while循环
$count = 0;
while ($count < 3) {
echo "计数:$count<br>";
$count++;
}
?>
四、数组 — PHP 最重要的数据结构
<?php
// ====================
// 1. 索引数组
// ====================
$colors = ["红", "绿", "蓝"];
$colors[] = "黄"; // 追加元素
count($colors); // 获取长度:4
array_push($colors, "紫"); // 也可以用push
array_pop($colors); // 弹出最后一个
// ====================
// 2. 关联数组(类似字典/对象)
// ====================
$user = [
"name" => "张三",
"age" => 25,
"email" => "zhangsan@example.com",
"skills" => ["PHP", "MySQL", "JavaScript"]
];
echo $user["name"]; // 张三
echo $user["skills"][0]; // PHP
// ====================
// 3. 常用数组函数
// ====================
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
sort($numbers); // 排序:[1,1,2,3,4,5,6,9]
rsort($numbers); // 降序:[9,6,5,4,3,2,1,1]
$unique = array_unique($numbers); // 去重
$merged = array_merge([1,2], [3,4]); // 合并:[1,2,3,4]
$sum = array_sum($numbers); // 求和
$max = max($numbers); // 最大值
$min = min($numbers); // 最小值
$filtered = array_filter($numbers, fn($n) => $n > 3); // 过滤
// ====================
// 4. JSON 编解码(API开发必备)
// ====================
$json = json_encode($user, JSON_UNESCAPED_UNICODE);
echo $json; // {"name":"张三","age":25,...}
$decoded = json_decode($json, true); // true=关联数组
echo $decoded["name"]; // 张三
?>
五、函数
<?php
// ====================
// 1. 基本函数
// ====================
function greet($name) {
return "你好,$name!";
}
echo greet("李四"); // 你好,李四!
// ====================
// 2. 默认参数
// ====================
function createUser($name, $role = "user", $active = true) {
return [
"name" => $name,
"role" => $role,
"active" => $active
];
}
$user = createUser("王五"); // role默认"user",active默认true
// ====================
// 3. 可变参数
// ====================
function sum(...$numbers) {
return array_sum($numbers);
}
echo sum(1, 2, 3, 4); // 10
// ====================
// 4. 匿名函数(闭包)
// ====================
$multiply = function($a, $b) {
return $a * $b;
};
echo $multiply(3, 4); // 12
// 在数组操作中常用
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(fn($n) => $n * 2, $numbers); // [2,4,6,8,10]
// ====================
// 5. 类型声明
// ====================
function divide(float $a, float $b): float {
if ($b == 0) {
throw new InvalidArgumentException("除数不能为0");
}
return $a / $b;
}
// divide(10, 0); // 抛出异常
// divide(10, 3); // 3.3333...
?>
六、面向对象编程(OOP)
<?php
// ====================
// 1. 类与对象
// ====================
class User {
// 属性(PHP 8.0+ 推荐使用类型声明)
public string $name;
public int $age;
public string $email;
private string $password;
// 构造函数
public function __construct(string $name, int $age, string $email) {
$this->name = $name;
$this->age = $age;
$this->email = $email;
$this->password = '';
}
// 方法
public function greet(): string {
return "我是{$this->name},今年{$this->age}岁";
}
// setter
public function setPassword(string $password): void {
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
// getter
public function getInfo(): array {
return [
'name' => $this->name,
'age' => $this->age,
'email' => $this->email
];
}
}
// 创建对象
$user = new User("张三", 25, "zhangsan@example.com");
$user->setPassword("123456");
echo $user->greet(); // 我是张三,今年25岁
print_r($user->getInfo());
// ====================
// 2. 继承
// ====================
class Admin extends User {
public string $role = 'admin';
public function greet(): string {
return parent::greet() . "(管理员)";
}
public function deleteUser(User $user): string {
return "管理员{$this->name}删除了用户{$user->name}";
}
}
$admin = new Admin("管理员", 30, "admin@example.com");
echo $admin->greet(); // 我是管理员,今年30岁(管理员)
// ====================
// 3. 接口
// ====================
interface Loggable {
public function toLog(): string;
}
class Order implements Loggable {
public string $id;
public float $amount;
public function __construct(string $id, float $amount) {
$this->id = $id;
$this->amount = $amount;
}
public function toLog(): string {
return "订单{$this->id}:金额{$this->amount}元";
}
}
// ====================
// 4. 抽象类
// ====================
abstract class Shape {
abstract public function area(): float;
abstract public function perimeter(): float;
public function describe(): string {
return "面积:{$this->area()},周长:{$this->perimeter()}";
}
}
class Circle extends Shape {
private float $radius;
public function __construct(float $radius) {
$this->radius = $radius;
}
public function area(): float {
return M_PI * $this->radius ** 2;
}
public function perimeter(): float {
return 2 * M_PI * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->describe(); // 面积:78.54,周长:31.42
?>
七、表单处理(Web开发核心)
7.1 HTML 表单
<!-- form.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
<style>
body { font-family: Arial; max-width: 400px; margin: 50px auto; }
input { width: 100%; padding: 10px; margin: 5px 0 15px; box-sizing: border-box; }
button { background: #4CAF50; color: white; padding: 12px 20px; border: none; cursor: pointer; width: 100%; }
</style>
</head>
<body>
<h2>用户注册</h2>
<form action="register.php" method="POST">
<label>用户名:</label>
<input type="text" name="username" required>
<label>邮箱:</label>
<input type="email" name="email" required>
<label>密码:</label>
<input type="password" name="password" required>
<button type="submit">注册</button>
</form>
</body>
</html>
7.2 PHP 处理表单
<?php
// register.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取表单数据
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
// 验证
$errors = [];
if (empty($username)) $errors[] = "用户名不能为空";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "邮箱格式不正确";
if (strlen($password) < 6) $errors[] = "密码至少6位";
if (empty($errors)) {
// 加密密码
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
// 这里应该存入数据库(下一节讲)
echo "注册成功!<br>";
echo "用户名:$username<br>";
echo "邮箱:$email<br>";
} else {
foreach ($errors as $error) {
echo "<p style='color:red'>$error</p>";
}
}
}
?>
八、文件操作
<?php
// ====================
// 1. 读写文件
// ====================
// 写入文件
$content = "第一行\n第二行\n第三行";
file_put_contents('data.txt', $content);
// 追加内容
file_put_contents('data.txt', "\n第四行", FILE_APPEND);
// 读取文件
$lines = file('data.txt', FILE_IGNORE_NEW_LINES);
print_r($lines); // ['第一行', '第二行', '第三行', '第四行']
// 逐行读取(大文件推荐)
$handle = fopen('data.txt', 'r');
while (($line = fgets($handle)) !== false) {
echo $line . "<br>";
}
fclose($handle);
// ====================
// 2. 文件上传
// ====================
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {
$file = $_FILES['avatar'];
// 检查错误
if ($file['error'] === UPLOAD_ERR_OK) {
// 检查文件类型
$allowed = ['image/jpeg', 'image/png', 'image/gif'];
if (in_array($file['type'], $allowed)) {
// 生成唯一文件名
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$newName = uniqid() . '.' . $ext;
$uploadDir = 'uploads/';
// 确保目录存在
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
// 移动文件
move_uploaded_file($file['tmp_name'], $uploadDir . $newName);
echo "上传成功:$newName";
} else {
echo "只允许上传图片文件";
}
}
}
?>
<!-- 上传表单 -->
<form method="POST" enctype="multipart/form-data">
<input type="file" name="avatar" accept="image/*">
<button type="submit">上传</button>
</form>
九、MySQL 数据库操作
<?php
// ====================
// 1. PDO 连接数据库(推荐)
// ====================
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=testdb;charset=utf8mb4',
'root',
'your_password',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
echo "数据库连接成功!";
} catch (PDOException $e) {
die("连接失败:" . $e->getMessage());
}
// ====================
// 2. 创建表
// ====================
$sql = "CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
$pdo->exec($sql);
// ====================
// 3. 插入数据(预处理防SQL注入)
// ====================
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute(['张三', 'zhangsan@example.com', password_hash('123456', PASSWORD_DEFAULT)]);
echo "插入成功,ID:" . $pdo->lastInsertId();
// ====================
// 4. 查询数据
// ====================
// 查询所有
$stmt = $pdo->query("SELECT * FROM users ORDER BY created_at DESC");
$users = $stmt->fetchAll();
print_r($users);
// 条件查询
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute(['张三']);
$user = $stmt->fetch();
if ($user) {
echo "找到用户:{$user['username']}";
}
// 分页查询
$page = 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT * FROM users LIMIT ? OFFSET ?");
$stmt->execute([$perPage, $offset]);
// ====================
// 5. 更新数据
// ====================
$stmt = $pdo->prepare("UPDATE users SET email = ? WHERE id = ?");
$stmt->execute(['newemail@example.com', 1]);
echo "更新了 " . $stmt->rowCount() . " 条记录";
// ====================
// 6. 删除数据
// ====================
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([1]);
echo "删除了 " . $stmt->rowCount() . " 条记录";
// ====================
// 7. 事务处理
// ====================
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
echo "转账成功";
} catch (Exception $e) {
$pdo->rollBack();
echo "转账失败:" . $e->getMessage();
}
?>
十、会话管理(Session + Cookie)
<?php
// ====================
// 1. Session(服务端存储)
// ====================
session_start();
// 存储数据
$_SESSION['user_id'] = 123;
$_SESSION['username'] = '张三';
// 读取数据
if (isset($_SESSION['user_id'])) {
echo "欢迎回来,{$_SESSION['username']}";
}
// 销毁会话(退出登录)
// session_destroy();
// ====================
// 2. Cookie(客户端存储)
// ====================
// 设置Cookie(有效期30天)
setcookie('remember_token', 'abc123', time() + 86400 * 30, '/');
// 读取Cookie
if (isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
// 验证token...
}
// 删除Cookie
setcookie('remember_token', '', time() - 3600, '/');
// ====================
// 3. 简单登录系统
// ====================
function login($username, $password) {
global $pdo;
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
session_start();
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
return true;
}
return false;
}
function isLoggedIn() {
return isset($_SESSION['user_id']);
}
function requireLogin() {
if (!isLoggedIn()) {
header('Location: login.php');
exit;
}
}
?>
十一、实战:完整的用户管理系统
<?php
// config.php - 数据库配置
return [
'host' => 'localhost',
'dbname' => 'myapp',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4'
];
// db.php - 数据库连接
function getDB() {
static $pdo = null;
if ($pdo === null) {
$config = require 'config.php';
$dsn = "mysql:host={$config['host']};dbname={$config['dbname']};charset={$config['charset']}";
$pdo = new PDO($dsn, $config['username'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
}
return $pdo;
}
// api.php - 简单的REST API
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type');
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pdo = getDB();
switch ($method) {
case 'GET':
if ($path === '/api/users') {
$stmt = $pdo->query("SELECT id, username, email, created_at FROM users");
echo json_encode($stmt->fetchAll(), JSON_UNESCAPED_UNICODE);
} elseif (preg_match('/\/api\/users\/(\d+)/', $path, $matches)) {
$stmt = $pdo->prepare("SELECT id, username, email, created_at FROM users WHERE id = ?");
$stmt->execute([$matches[1]]);
$user = $stmt->fetch();
echo json_encode($user ?: ['error' => '用户不存在'], JSON_UNESCAPED_UNICODE);
}
break;
case 'POST':
if ($path === '/api/users') {
$data = json_decode(file_get_contents('php://input'), true);
$errors = validateUser($data);
if (empty($errors)) {
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute([
$data['username'],
$data['email'],
password_hash($data['password'], PASSWORD_DEFAULT)
]);
http_response_code(201);
echo json_encode(['id' => $pdo->lastInsertId()], JSON_UNESCAPED_UNICODE);
} else {
http_response_code(400);
echo json_encode(['errors' => $errors], JSON_UNESCAPED_UNICODE);
}
}
break;
}
function validateUser($data) {
$errors = [];
if (empty($data['username'])) $errors[] = "用户名不能为空";
if (!filter_var($data['email'] ?? '', FILTER_VALIDATE_EMAIL)) $errors[] = "邮箱格式不正确";
if (strlen($data['password'] ?? '') < 6) $errors[] = "密码至少6位";
return $errors;
}
?>
十二、PHP 常用框架
| 框架 | 特点 | 适用场景 | 学习难度 |
|---|---|---|---|
| <strong>Laravel</strong> | 最流行、生态完善、优雅 | 中大型项目、API | ★★★☆☆ |
| <strong>ThinkPHP</strong> | 国产、中文文档好 | 中小型项目、国内项目 | ★★☆☆☆ |
| <strong>Symfony</strong> | 企业级、组件化 | 大型企业项目 | ★★★★☆ |
| <strong>Slim</strong> | 轻量微框架 | API、小型项目 | ★★☆☆☆ |
| <strong>Yii</strong> | 高性能、组件丰富 | 中大型项目 | ★★★☆☆ |
学习建议
- 先跑通第一个PHP页面,看到输出结果建立信心
- 重点掌握数组操作和MySQL操作,这是PHP开发的核心
- 理解表单处理流程:HTML表单 → PHP接收 → 验证 → 存数据库
- 学完基础后立即学Laravel,现代PHP开发几乎都用框架
- 配合宝塔面板部署,熟悉生产环境