缩略图

PHP面试题精选:从基础到高级全面解析

2025年09月04日 文章分类 会被自动插入 会被自动插入
本文最后更新于2025-09-04已经过去了36天请注意内容时效性
热度18 点赞 收藏0 评论0

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
正文结束 阅读本文相关话题
相关阅读
评论框
正在回复
评论列表
暂无评论,快来抢沙发吧~