PHP面试题精选:从基础到高级全面解析
前言
在当今互联网时代,PHP作为最流行的服务器端脚本语言之一,仍然是Web开发领域的重要组成部分。无论是初创公司还是大型企业,对PHP开发人才的需求始终旺盛。本文将从PHP面试的角度出发,全面解析常见的PHP面试题,帮助开发者更好地准备面试,提升技术水平。
PHP基础知识
变量和数据类型
PHP是一种弱类型语言,这意味着变量不需要声明其数据类型。PHP支持8种原始数据类型,分为三种类型:标量类型(boolean、integer、float、string)、复合类型(array、object)和特殊类型(resource、NULL)。
// 标量类型示例
$bool = true; // 布尔值
$int = 123; // 整型
$float = 3.14; // 浮点型
$str = "Hello World"; // 字符串
// 复合类型示例
$arr = [1, 2, 3]; // 数组
$obj = new stdClass(); // 对象
// 特殊类型示例
$resource = fopen('file.txt', 'r'); // 资源
$null = null; // NULL
超全局变量
PHP提供了多个超全局变量,它们在所有作用域中都可用的内置变量。这些变量包括:$_GET
、$_POST
、$_REQUEST
、$_SESSION
、$_COOKIE
、$_SERVER
、$_ENV
和$_FILES
。
// 获取GET参数
$id = $_GET['id'] ?? 0;
// 获取POST参数
$username = $_POST['username'] ?? '';
// 服务器信息
$serverName = $_SERVER['SERVER_NAME'];
// Session操作
session_start();
$_SESSION['user_id'] = 123;
常量和魔术常量
常量是不可改变的值,使用define()
函数定义。PHP还提供了一些魔术常量,它们的值会根据使用的位置而变化。
// 定义常量
define('APP_NAME', 'My Application');
echo APP_NAME;
// 魔术常量
echo __LINE__; // 当前行号
echo __FILE__; // 文件完整路径
echo __DIR__; // 文件所在目录
echo __FUNCTION__; // 当前函数名
echo __CLASS__; // 当前类名
echo __METHOD__; // 当前方法名
echo __NAMESPACE__;// 当前命名空间
面向对象编程
类和对象
PHP支持面向对象编程,包括类、对象、继承、多态等特性。
class Person
{
// 属性
public $name;
protected $age;
private $salary;
// 构造方法
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
// 方法
public function introduce()
{
return "我叫{$this->name},今年{$this->age}岁";
}
// 静态方法
public static function create($name, $age)
{
return new self($name, $age);
}
}
// 创建对象
$person = new Person('张三', 25);
echo $person->introduce();
// 静态方法调用
$person2 = Person::create('李四', 30);
继承和多态
class Employee extends Person
{
private $position;
public function __construct($name, $age, $position)
{
parent::__construct($name, $age);
$this->position = $position;
}
// 方法重写
public function introduce()
{
return parent::introduce() . ",职位是{$this->position}";
}
}
$employee = new Employee('王五', 28, '开发工程师');
echo $employee->introduce();
接口和抽象类
// 接口
interface Loggable
{
public function log($message);
}
// 抽象类
abstract class Database
{
abstract public function connect();
abstract public function query($sql);
public function close()
{
echo "关闭数据库连接";
}
}
// 实现接口和继承抽象类
class MySQL extends Database implements Loggable
{
public function connect()
{
echo "连接MySQL数据库";
}
public function query($sql)
{
echo "执行SQL查询: {$sql}";
}
public function log($message)
{
echo "记录日志: {$message}";
}
}
高级特性
命名空间
命名空间解决了类名冲突的问题,允许在相同的类名下组织代码。
namespace MyApp\Database;
class MySQL
{
public function connect()
{
echo "MyApp数据库连接";
}
}
// 使用命名空间
$db = new \MyApp\Database\MySQL();
Trait特性
Trait是为类似PHP的单继承语言而准备的一种代码复用机制。
trait LogTrait
{
public function log($message)
{
echo "记录日志: {$message}";
}
}
trait ValidationTrait
{
public function validateEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
}
class User
{
use LogTrait, ValidationTrait;
public function register($email)
{
if ($this->validateEmail($email)) {
$this->log("用户注册: {$email}");
return true;
}
return false;
}
}
异常处理
PHP使用try-catch块来处理异常。
class CustomException extends Exception
{
public function __construct($message, $code = 0, Exception $previous = null)
{
parent::__construct($message, $code, $previous);
}
public function __toString()
{
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
}
try {
$value = -1;
if ($value < 0) {
throw new CustomException("数值不能为负数");
}
} catch (CustomException $e) {
echo "自定义异常: " . $e->getMessage();
} catch (Exception $e) {
echo "通用异常: " . $e->getMessage();
} finally {
echo "最终执行块";
}
数据库操作
PDO扩展
PDO(PHP Data Objects)提供了一个数据访问抽象层,可以统一操作多种数据库。
try {
// 创建PDO实例
$pdo = new PDO(
'mysql:host=localhost;dbname=test;charset=utf8',
'username',
'password',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
// 预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND status = :status");
$stmt->execute([
':id' => 1,
':status' => 'active'
]);
// 获取结果
$user = $stmt->fetch();
// 插入数据
$insertStmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$insertStmt->execute(['张三', 'zhangsan@example.com']);
// 事务处理
$pdo->beginTransaction();
try {
// 执行多个操作
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
} catch (PDOException $e) {
echo "数据库错误: " . $e->getMessage();
}
MySQLi扩展
MySQLi是专门用于MySQL数据库的扩展。
// 创建连接
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
// 检查连接
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 预处理语句
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
// 设置参数并执行
$name = "李四";
$email = "lisi@example.com";
$stmt->execute();
// 查询数据
$result = $mysqli->query("SELECT * FROM users");
while ($row = $result->fetch_assoc()) {
echo $row['name'] . " - " . $row['email'];
}
// 关闭连接
$stmt->close();
$mysqli->close();
安全编程
SQL注入防护
使用预处理语句是防止SQL注入的最佳方式。
// 不安全的写法
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id"; // 容易遭受SQL注入
// 安全的写法 - PDO
$stmt = $pdo->prepare
评论框