本次PHP类实验围绕面向对象编程核心展开,通过定义自定义类、封装属性与方法,实现代码模块化,实验中创建包含成员变量与成员函数的类,如“用户类”封装姓名、年龄等属性及信息获取方法,通过实例化对象调用功能,验证类的封装特性,同时探究继承机制,实现子类对父类方法的扩展与重写,体会多态性,实验加深了对类与对象、构造函数、访问控制等概念的理解,掌握了利用PHP类构建可复用、可维护代码的方法,为后续复杂开发奠定基础。
PHP类的实验:从基础到实践的探索
实验目的
PHP作为现代Web开发领域的主流服务器端脚本语言,其面向对象编程(OOP)特性是构建大型、复杂应用系统的核心技术支撑,本次实验通过系统化的实践操作,旨在深入掌握PHP类的基本概念和高级特性,包括类的定义与结构、属性与方法的设计、构造函数与析构函数的生命周期管理、继承机制的实现、多态性的应用以及封装原则的实践,通过本实验,开发者将能够熟练运用类来实现代码的高度复用、逻辑的合理封装和系统的模块化设计,为后续开发高可维护性、高可扩展性的PHP企业级应用奠定坚实的技术基础。
实验环境
- 操作系统:Windows 11 64位
- 开发工具:Visual Studio Code 1.85
- PHP版本:8.2.3
- 本地服务器环境:XAMPP 8.2.3(集成Apache 2.4.57和MySQL 8.0.30)
- 浏览器:Google Chrome 120.0
- 代码格式化工具:PHP CodeSniffer
实验过程
类的定义与实例化:从"蓝图"到"实体"
类是面向对象编程中的核心概念,它如同创建对象的"蓝图"或"模板",用于定义对象的特征(属性)和行为(方法),本实验首先创建一个基础的"Person"类,演示如何定义属性和方法,以及如何实例化对象。
<?php
/**
* Person类定义
* 展示基本的类结构和对象实例化过程
*/
class Person {
// 公共属性(成员变量)
public $name;
public $age;
public $gender;
// 公共方法(成员函数)
public function introduce() {
return "大家好,我叫{$this->name},今年{$this->age}岁,性别{$this->gender}。";
}
// 设置属性的方法
public function setAttributes($name, $age, $gender) {
$this->name = $name;
$this->age = $age;
$this->gender = $gender;
}
}
// 实例化对象:创建类的具体实例
$person1 = new Person();
$person1->setAttributes("张三", 25, "男");
// 调用方法并输出结果
echo $person1->introduce();
// 输出:大家好,我叫张三,今年25岁,性别男。
?>
关键知识点解析:
- 访问修饰符:
public表示属性/方法可以在任何地方访问,还有protected(仅本类和子类可访问)和private(仅本类可访问) - $this伪变量:指向当前对象的实例,用于访问对象的属性和方法
- 属性初始化:PHP 7.4+支持属性类型声明,如
public string $name; - 方法设计:方法应遵循单一职责原则,保持功能专注
构造函数与析构函数:对象的完整生命周期管理
构造函数和析构函数是PHP类中两个特殊的方法,它们分别在对象创建和销毁时自动调用,用于实现资源的初始化和清理。
<?php
/**
* Person类增强版
* 包含构造函数和析构函数的生命周期管理
*/
class Person {
public $name;
public $age;
public $birthDate;
/**
* 构造函数:对象创建时自动调用
* 用于初始化对象属性
*/
public function __construct($name, $age, $birthDate = null) {
$this->name = $name;
$this->age = $age;
$this->birthDate = $birthDate ?? date('Y-m-d', strtotime("-{$age} years"));
echo "对象 '{$name}' 已成功创建!\n";
}
/**
* 析构函数:对象销毁时自动调用
* 通常用于释放资源(如关闭文件、数据库连接等)
*/
public function __destruct() {
echo "对象 '{$this->name}' 的资源已释放,即将被销毁,\n";
}
public function introduce() {
return "大家好,我叫{$this->name},今年{$this->age}岁,出生日期:{$this->birthDate}。";
}
/**
* 计算年龄的方法
* @param string $birthDate 出生日期
* @return int 当前年龄
*/
public static function calculateAge($birthDate) {
$birthDate = new DateTime($birthDate);
$today = new DateTime('today');
$age = $today->diff($birthDate)->y;
return $age;
}
}
// 实例化对象时自动调用构造函数
$person1 = new Person("李四", 30, "1993-05-15");
echo $person1->introduce();
// 使用静态方法计算年龄
echo "通过出生日期计算的年龄:" . Person::calculateAge("1993-05-15") . "岁\n";
// 手动销毁对象(演示析构函数调用)
unset($person1);
// 脚本结束时剩余对象会自动调用析构函数
?>
运行结果分析:
对象 '李四' 已成功创建!
大家好,我叫李四,今年30岁,出生日期:1993-05-15。
通过出生日期计算的年龄:30岁
对象 '李四' 的资源已释放,即将被销毁。
最佳实践建议:
- 构造函数应保持轻量级,避免耗时操作
- 析构函数主要用于资源清理,不要依赖其执行顺序
- 复杂资源管理建议使用try-catch-finally模式
继承与多态:实现代码复用与灵活扩展
继承是面向对象编程的重要特性,它允许子类继承父类的属性和方法,实现代码复用;多态则通过继承或接口,让不同对象对同一方法产生不同的响应。
1 继承机制:构建类层次结构
<?php
/**
* 父类:Person基类
* 定义基本的人员属性和方法
*/
abstract class Person {
protected $name;
protected $age;
protected $id;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
$this->id = uniqid('person_');
}
// 抽象方法,子类必须实现
abstract public function getRole();
// 普通方法
public function introduce() {
return "我叫{$this->name},今年{$this->age}岁。";
}
// 静态方法
public static function create($name, $age) {
return new static($name, $age);
}
}
/**
* 子类:Student类
* 继承Person类并扩展学生特有的功能
*/
class Student extends Person {
private $school;
private $studentId;
private $courses = [];
public function __construct($name, $age, $school) {
parent::__construct($name, $age);
$this->school = $school;
$this->studentId = 'STU' . rand(1000, 9999);
}
// 实现抽象方法
public function getRole() {
return "学生";
}
// 重写父类方法
public function introduce() {
return parent::introduce() . " 我在{$this->school}上学,学号:{$this->studentId}。";
}
// 添加学生特有的方法
public function addCourse($course) {
$this->courses