PHP面试题精选:从基础到进阶全面解析
前言
PHP作为最流行的服务器端脚本语言之一,在Web开发领域占据着重要地位。无论是初学者还是资深开发者,掌握PHP的核心概念和高级特性都至关重要。本文整理了常见的PHP面试题,从基础语法到高级特性,从数据库操作到安全防护,全面覆盖PHP开发者需要掌握的知识点,帮助读者在面试中脱颖而出。
一、PHP基础语法与特性
1.1 变量与数据类型
PHP是一种弱类型语言,变量的数据类型不需要显式声明。PHP支持8种原始数据类型:
- 四种标量类型:boolean(布尔型)、integer(整型)、float(浮点型,也称作double)、string(字符串)
- 两种复合类型:array(数组)、object(对象)
- 两种特殊类型:resource(资源)、NULL(无类型)
// 变量声明示例
$name = "John"; // 字符串
$age = 25; // 整型
$price = 19.99; // 浮点型
$is_active = true; // 布尔型
$fruits = array("apple", "banana", "orange"); // 数组
1.2 超全局变量
PHP提供了多个超全局变量,它们在所有作用域中都可使用:
$_GET
- 通过URL参数传递的变量$_POST
- 通过HTTP POST方法传递的变量$_REQUEST
- 包含了$_GET
、$_POST
和$_COOKIE
的数组$_SESSION
- 会话变量$_COOKIE
- HTTP Cookies$_SERVER
- 服务器和执行环境信息$_ENV
- 环境变量$_FILES
- 通过HTTP POST方式上传到当前脚本的文件项
1.3 常量与魔术常量
常量使用define()
函数定义,一旦定义就不能被改变或重新定义:
define("SITE_NAME", "My Website");
echo SITE_NAME;
PHP还提供了一些魔术常量,它们的值会根据使用的位置而变化:
__LINE__
- 文件中的当前行号__FILE__
- 文件的完整路径和文件名__DIR__
- 文件所在的目录__FUNCTION__
- 函数名称__CLASS__
- 类的名称__METHOD__
- 类的方法名__NAMESPACE__
- 当前命名空间的名称
二、PHP面向对象编程
2.1 类与对象
PHP支持面向对象编程,包括类、对象、继承、多态等特性:
class Person {
// 属性
public $name;
private $age;
protected $email;
// 构造方法
public function __construct($name, $age, $email) {
$this->name = $name;
$this->age = $age;
$this->email = $email;
}
// 方法
public function getAge() {
return $this->age;
}
// 静态方法
public static function sayHello() {
return "Hello!";
}
}
// 创建对象
$person = new Person("John", 25, "john@example.com");
echo $person->name; // 输出: John
echo $person->getAge(); // 输出: 25
echo Person::sayHello(); // 输出: Hello!
2.2 继承与多态
PHP支持单继承,使用extends
关键字:
class Student extends Person {
public $studentId;
public function __construct($name, $age, $email, $studentId) {
parent::__construct($name, $age, $email);
$this->studentId = $studentId;
}
// 方法重写
public function getAge() {
return "年龄: " . parent::getAge();
}
}
2.3 接口与抽象类
// 接口
interface Logger {
public function log($message);
}
// 抽象类
abstract class AbstractLogger {
abstract protected function write($message);
public function log($message) {
$this->write($message);
}
}
// 实现
class FileLogger extends AbstractLogger implements Logger {
protected function write($message) {
file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
}
}
2.4 特质(Trait)
PHP5.4+引入了特质,用于解决单继承的限制:
trait Loggable {
public function log($message) {
echo "[" . date('Y-m-d H:i:s') . "] " . $message . PHP_EOL;
}
}
class User {
use Loggable;
public function create() {
// 创建用户逻辑
$this->log("用户已创建");
}
}
三、PHP高级特性
3.1 命名空间(Namespace)
命名空间用于解决命名冲突问题:
namespace MyProject\Database;
class Connection {
public function connect() {
// 连接数据库
}
}
// 使用
$conn = new \MyProject\Database\Connection();
3.2 自动加载
PHP提供了自动加载机制,避免手动包含大量文件:
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
// 或者使用PSR-4标准
spl_autoload_register(function ($class) {
$prefix = 'MyApp\\';
$base_dir = __DIR__ . '/src/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
3.3 错误与异常处理
// 错误处理
set_error_handler(function($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
// 异常处理
try {
// 可能抛出异常的代码
$file = fopen("nonexistent.txt", "r");
} catch (Exception $e) {
echo "错误: " . $e->getMessage();
} finally {
echo "执行完成";
}
// 自定义异常
class MyException 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";
}
}
3.4 生成器(Generator)
生成器提供了一种更简单的方法来实现迭代器:
function xrange($start, $limit, $step = 1) {
if ($start <= $limit) {
if ($step <= 0) {
throw new LogicException('Step must be positive');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be negative');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
// 使用
foreach (xrange(1, 1000000, 1) as $number) {
echo $number . "\n";
}
四、PHP与数据库交互
4.1 PDO数据库操作
PDO(PHP Data Objects)提供了一个数据访问抽象层:
try {
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND status = :status");
$stmt->execute(['email' => $email, 'status' => 1]);
// 获取结果
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => 'John', 'email' => 'john@example.com']);
// 事务处理
$pdo->beginTransaction();
// 执行多个操作
$pdo->commit();
} catch (PDOException $e) {
echo "数据库错误
评论框