PHP 知识总结与面试题
PHP 语言的知识体系梳理,覆盖数据类型与变量、函数、面向对象、PDO 数据库操作、Session 与 Cookie 等内容,配代码示例与面试题,适合 PHP 后端开发者日常查阅。
一、PHP 基础概念
1. 什么是 PHP?
- 超文本预处理器(Hypertext Preprocessor)
- 服务器端脚本语言
- 主要用于 Web 开发,嵌入 HTML 中
- 支持多种数据库(MySQL、PostgreSQL、MongoDB等)
2. PHP 的特点
- 开源免费
- 跨平台(Windows、Linux、macOS)
- 简单易学
- 丰富的扩展库
- 与 HTML 无缝集成
3. 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. 复合数据类型
// 数组$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. 类型转换
// 自动转换$num = "10";$result = $num + 5; // 15(自动转为整数)// 强制转换$str = (string) 123; // "123"$int = (int) "45.6"; // 45三、变量与常量
1. 变量声明
// 变量以 $ 开头$name = "John";$age = 25;// 可变变量$var = "name";$$var = "Doe"; // $name = "Doe"2. 常量声明
// 使用 define()define("PI", 3.14159);define("APP_NAME", "MyApp");// 使用 const(PHP 5.3+)const DB_HOST = "localhost";const DB_PORT = 3306;3. 变量作用域
// 全局变量$globalVar = "Global";function test() { // 局部变量 $localVar = "Local"; // 使用全局变量 global $globalVar; echo $globalVar; // 或使用 $GLOBALS echo $GLOBALS['globalVar'];}四、控制结构
1. 条件语句
// if-elseif ($age >= 18) { echo "成年人";} elseif ($age >= 13) { echo "青少年";} else { echo "儿童";}// switchswitch ($day) { case "Monday": echo "周一"; break; case "Tuesday": echo "周二"; break; default: echo "其他";}2. 循环语句
// 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. 函数定义
// 基本函数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. 递归函数
function factorial($n) { if ($n <= 1) { return 1; } return $n * factorial($n - 1);}六、面向对象编程
1. 类与对象
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. 继承
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. 接口与抽象类
// 接口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(面向对象)
// 连接数据库$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
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
// 开始会话session_start();// 设置会话变量$_SESSION['username'] = 'john';$_SESSION['user_id'] = 1;// 获取会话变量echo $_SESSION['username'];// 检查会话是否存在if (isset($_SESSION['user_id'])) { // 用户已登录}// 销毁会话session_destroy();2. Cookie
// 设置 Cookie(有效期1小时)setcookie("username", "john", time() + 3600, "/");// 获取 Cookieif (isset($_COOKIE['username'])) { echo $_COOKIE['username'];}// 删除 Cookiesetcookie("username", "", time() - 3600);九、文件处理
1. 文件读写
// 读取文件$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. 文件上传
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. 错误报告
// 开启错误报告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. 异常处理
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导入
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 中的引用是什么?
- 使用
&符号创建引用 - 引用指向变量的内存地址
- 多个变量指向同一个值
$a = 10;$b = &$a;$b = 20;echo $a; // 20Q20:什么是闭包(Closure)?
- 匿名函数,可以访问外部变量
- 使用
use关键字引入外部变量
$message = "Hello";$greet = function($name) use ($message) { return "$message, $name!";};十二、最佳实践
- 使用最新 PHP 版本:享受性能提升和新特性
- 使用 Composer:管理依赖和自动加载
- 使用预处理语句:防止 SQL 注入
- 开启错误日志:便于调试和监控
- 使用框架:如 Laravel、Symfony,提高开发效率
- 代码规范:遵循 PSR 标准
十三、总结
PHP 是 Web 开发的主流语言之一,掌握其核心概念、面向对象编程、数据库操作和安全实践是成为优秀 PHP 开发者的关键。