全栈手账 订阅 RSS
PHP

PHP 知识总结与面试题

PHP 语言的知识体系梳理,覆盖数据类型与变量、函数、面向对象、PDO 数据库操作、Session 与 Cookie 等内容,配代码示例与面试题,适合 PHP 后端开发者日常查阅。

读了 20 分钟 更新于 8 月 5 日

一、PHP 基础概念

1. 什么是 PHP?

  • 超文本预处理器(Hypertext Preprocessor)
  • 服务器端脚本语言
  • 主要用于 Web 开发,嵌入 HTML 中
  • 支持多种数据库(MySQL、PostgreSQL、MongoDB等)

2. PHP 的特点

  • 开源免费
  • 跨平台(Windows、Linux、macOS)
  • 简单易学
  • 丰富的扩展库
  • 与 HTML 无缝集成

3. PHP 文件结构

php
<?php// PHP 代码echo "Hello, World!";?><!-- 可以嵌入 HTML --><html><body>    <h1><?php echo "欢迎"; ?></h1></body></html>

二、数据类型

1. 基本数据类型

类型 说明 示例
int 整数 $age = 25;
float 浮点数 $price = 99.99;
string 字符串 $name = "John";
bool 布尔值 $isActive = true;
null 空值 $var = null;

2. 复合数据类型

php
// 数组$colors = array("red", "green", "blue");$user = [    "name" => "John",    "age" => 25];// 对象class Person {    public $name;    public function __construct($name) {        $this->name = $name;    }}$person = new Person("John");

3. 类型转换

php
// 自动转换$num = "10";$result = $num + 5; // 15(自动转为整数)// 强制转换$str = (string) 123; // "123"$int = (int) "45.6"; // 45

三、变量与常量

1. 变量声明

php
// 变量以 $ 开头$name = "John";$age = 25;// 可变变量$var = "name";$$var = "Doe"; // $name = "Doe"

2. 常量声明

php
// 使用 define()define("PI", 3.14159);define("APP_NAME", "MyApp");// 使用 const(PHP 5.3+)const DB_HOST = "localhost";const DB_PORT = 3306;

3. 变量作用域

php
// 全局变量$globalVar = "Global";function test() {    // 局部变量    $localVar = "Local";        // 使用全局变量    global $globalVar;    echo $globalVar;        // 或使用 $GLOBALS    echo $GLOBALS['globalVar'];}

四、控制结构

1. 条件语句

php
// if-elseif ($age >= 18) {    echo "成年人";} elseif ($age >= 13) {    echo "青少年";} else {    echo "儿童";}// switchswitch ($day) {    case "Monday":        echo "周一";        break;    case "Tuesday":        echo "周二";        break;    default:        echo "其他";}

2. 循环语句

php
// for 循环for ($i = 0; $i < 10; $i++) {    echo $i;}// while 循环$count = 0;while ($count < 10) {    echo $count++;}// foreach 循环(数组)$fruits = ["apple", "banana", "orange"];foreach ($fruits as $fruit) {    echo $fruit;}// 带键的 foreachforeach ($user as $key => $value) {    echo "$key: $value";}

五、函数

1. 函数定义

php
// 基本函数function greet($name) {    return "Hello, $name!";}// 带默认参数function greetWithDefault($name = "Guest") {    return "Hello, $name!";}// 可变参数(PHP 5.6+)function sum(...$numbers) {    return array_sum($numbers);}// 匿名函数$add = function($a, $b) {    return $a + $b;};// 箭头函数(PHP 7.4+)$multiply = fn($a, $b) => $a * $b;

2. 递归函数

php
function factorial($n) {    if ($n <= 1) {        return 1;    }    return $n * factorial($n - 1);}

六、面向对象编程

1. 类与对象

php
class Person {    // 属性    public $name;    private $age;        // 构造方法    public function __construct($name, $age) {        $this->name = $name;        $this->age = $age;    }        // 方法    public function greet() {        return "Hello, my name is {$this->name}";    }        // Getter    public function getAge() {        return $this->age;    }        // Setter    public function setAge($age) {        if ($age > 0) {            $this->age = $age;        }    }}// 创建对象$person = new Person("John", 25);echo $person->name; // "John"echo $person->greet(); // "Hello, my name is John"

2. 继承

php
class Student extends Person {    private $grade;        public function __construct($name, $age, $grade) {        parent::__construct($name, $age);        $this->grade = $grade;    }        public function study() {        return "{$this->name} is studying in grade {$this->grade}";    }}$student = new Student("Alice", 18, 12);echo $student->study(); // "Alice is studying in grade 12"

3. 访问修饰符

修饰符 说明
public 公共的,可在类内外访问
protected 受保护的,仅类和子类可访问
private 私有的,仅类内部可访问

4. 接口与抽象类

php
// 接口interface Shape {    public function getArea();    public function getPerimeter();}// 实现接口class Circle implements Shape {    private $radius;        public function __construct($radius) {        $this->radius = $radius;    }        public function getArea() {        return pi() * $this->radius * $this->radius;    }        public function getPerimeter() {        return 2 * pi() * $this->radius;    }}// 抽象类abstract class Animal {    protected $name;        public function __construct($name) {        $this->name = $name;    }        abstract public function makeSound();}class Dog extends Animal {    public function makeSound() {        return "Woof!";    }}

七、数据库操作

1. MySQLi(面向对象)

php
// 连接数据库$servername = "localhost";$username = "root";$password = "password";$dbname = "myDB";$conn = new mysqli($servername, $username, $password, $dbname);// 检查连接if ($conn->connect_error) {    die("连接失败: " . $conn->connect_error);}// 查询数据$sql = "SELECT id, name, email FROM users";$result = $conn->query($sql);if ($result->num_rows > 0) {    while($row = $result->fetch_assoc()) {        echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";    }}// 插入数据(预处理语句,防止SQL注入)$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");$stmt->bind_param("ss", $name, $email);$name = "John";$email = "john@example.com";$stmt->execute();$stmt->close();$conn->close();

2. PDO

php
try {    $conn = new PDO("mysql:host=localhost;dbname=myDB", $username, $password);    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);        // 查询    $stmt = $conn->prepare("SELECT * FROM users WHERE id = :id");    $stmt->bindParam(':id', $id);    $stmt->execute();        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);        // 插入    $stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");    $stmt->execute(['name' => 'John', 'email' => 'john@example.com']);    } catch(PDOException $e) {    echo "Error: " . $e->getMessage();}$conn = null;

八、会话管理

1. Session

php
// 开始会话session_start();// 设置会话变量$_SESSION['username'] = 'john';$_SESSION['user_id'] = 1;// 获取会话变量echo $_SESSION['username'];// 检查会话是否存在if (isset($_SESSION['user_id'])) {    // 用户已登录}// 销毁会话session_destroy();

2. Cookie

php
// 设置 Cookie(有效期1小时)setcookie("username", "john", time() + 3600, "/");// 获取 Cookieif (isset($_COOKIE['username'])) {    echo $_COOKIE['username'];}// 删除 Cookiesetcookie("username", "", time() - 3600);

九、文件处理

1. 文件读写

php
// 读取文件$content = file_get_contents("example.txt");// 写入文件file_put_contents("example.txt", "Hello, World!");// 逐行读取$handle = fopen("example.txt", "r");while (!feof($handle)) {    $line = fgets($handle);    echo $line;}fclose($handle);// 追加内容file_put_contents("example.txt", "追加内容", FILE_APPEND);

2. 文件上传

php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {    $targetDir = "uploads/";    $targetFile = $targetDir . basename($_FILES["file"]["name"]);        // 检查文件类型    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];    if (in_array($_FILES["file"]["type"], $allowedTypes)) {        if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)) {            echo "文件上传成功";        } else {            echo "文件上传失败";        }    } else {        echo "不允许的文件类型";    }}

十、错误处理

1. 错误报告

php
// 开启错误报告error_reporting(E_ALL);ini_set('display_errors', 1);// 关闭错误显示(生产环境)ini_set('display_errors', 0);ini_set('log_errors', 1);ini_set('error_log', '/var/log/php_errors.log');

2. 异常处理

php
try {    // 可能抛出异常的代码    $result = 10 / 0;} catch (Exception $e) {    // 捕获异常    echo "错误: " . $e->getMessage();} finally {    // 无论是否异常都会执行    echo "操作完成";}// 自定义异常class CustomException extends Exception {}try {    throw new CustomException("自定义错误");} catch (CustomException $e) {    echo $e->getMessage();}

十一、PHP 面试题

基础概念

Q1:PHP 是什么?它的主要特点是什么?

  • PHP 是服务器端脚本语言
  • 开源免费、跨平台、简单易学
  • 与 HTML 无缝集成,适合 Web 开发

Q2:PHP 的变量有什么特点?

  • 变量以 $ 开头
  • 弱类型,无需声明类型
  • 区分大小写(变量名)

Q3:PHP 有哪些数据类型?

  • 基本类型:int、float、string、bool、null
  • 复合类型:array、object
  • 特殊类型:resource

面向对象

Q4:PHP 中的访问修饰符有哪些?

  • public:公共的
  • protected:受保护的
  • private:私有的

Q5:接口和抽象类的区别?

  • 接口只能包含方法声明,抽象类可以有实现
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 接口用于定义契约,抽象类用于代码复用

Q6:什么是魔术方法?常见的魔术方法有哪些?

  • 以 __ 开头的方法,在特定场景自动调用
  • __construct:构造方法
  • __destruct:析构方法
  • __get/__set:访问不存在的属性
  • __call:调用不存在的方法

数据库

Q7:MySQLi 和 PDO 的区别?

  • MySQLi 只支持 MySQL,PDO 支持多种数据库
  • MySQLi 有面向过程和面向对象两种风格
  • PDO 使用预处理语句更安全,防止 SQL 注入

Q8:如何防止 SQL 注入?

  • 使用预处理语句(Prepared Statements)
  • 对用户输入进行过滤和转义
  • 使用 ORM 框架

会话管理

Q9:Session 和 Cookie 的区别?

  • Session 存储在服务器端,Cookie 存储在客户端
  • Session 更安全,Cookie 更轻便
  • Session 依赖 Cookie(存储 session ID)

Q10:如何实现用户登录状态保持?

  • 使用 Session 存储用户信息
  • 使用 Cookie 存储会话 ID
  • 设置合理的会话超时时间

错误处理

Q11:PHP 的错误类型有哪些?

  • Notice:提示信息
  • Warning:警告
  • Error:致命错误
  • Parse Error:语法错误

Q12:try-catch 和错误报告有什么区别?

  • try-catch 用于处理异常
  • 错误报告用于显示运行时错误
  • 异常是可恢复的,错误通常导致脚本终止

进阶问题

Q13:什么是命名空间?

  • 用于组织代码,避免类名冲突
  • 使用 namespace 声明
  • 使用 use 导入
php
namespace App\Controllers;class UserController {}

Q14:什么是 Composer?

  • PHP 的依赖管理工具
  • 自动加载类文件
  • 管理项目依赖

Q15:PHP 7 和 PHP 5 相比有哪些改进?

  • 性能提升(约2倍)
  • 标量类型声明
  • 返回类型声明
  • 空合并运算符(??)
  • 太空船运算符(<=>)
  • 匿名类

Q16:什么是 PSR 标准?

  • PHP Standard Recommendations
  • PSR-4:自动加载标准
  • PSR-7:HTTP 消息接口
  • PSR-12:代码风格指南

Q17:如何优化 PHP 性能?

  • 使用缓存(OpCache、Redis)
  • 优化数据库查询
  • 使用 PHP 7+ 版本
  • 减少文件包含
  • 使用 CDN 加速静态资源

Q18:什么是自动加载?

  • 自动加载类文件,无需手动 include/require
  • 使用 spl_autoload_register() 注册自动加载函数
  • PSR-4 规范定义了自动加载标准

Q19:PHP 中的引用是什么?

  • 使用 & 符号创建引用
  • 引用指向变量的内存地址
  • 多个变量指向同一个值
php
$a = 10;$b = &$a;$b = 20;echo $a; // 20

Q20:什么是闭包(Closure)?

  • 匿名函数,可以访问外部变量
  • 使用 use 关键字引入外部变量
php
$message = "Hello";$greet = function($name) use ($message) {    return "$message, $name!";};

十二、最佳实践

  1. 使用最新 PHP 版本:享受性能提升和新特性
  2. 使用 Composer:管理依赖和自动加载
  3. 使用预处理语句:防止 SQL 注入
  4. 开启错误日志:便于调试和监控
  5. 使用框架:如 Laravel、Symfony,提高开发效率
  6. 代码规范:遵循 PSR 标准

十三、总结

PHP 是 Web 开发的主流语言之一,掌握其核心概念、面向对象编程、数据库操作和安全实践是成为优秀 PHP 开发者的关键。

前端、后端、部署、客服都是我一个人。写这里的东西都是真踩过的坑,不是抄来的教程。