PHP 零基础入门教程 — 从零到实战

适用人群:零基础、想学后端开发的初学者
学习时长:约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>高性能、组件丰富中大型项目★★★☆☆

学习建议

  1. 先跑通第一个PHP页面,看到输出结果建立信心
  2. 重点掌握数组操作和MySQL操作,这是PHP开发的核心
  3. 理解表单处理流程:HTML表单 → PHP接收 → 验证 → 存数据库
  4. 学完基础后立即学Laravel,现代PHP开发几乎都用框架
  5. 配合宝塔面板部署,熟悉生产环境

下一步学习

返回首页