PHP 面向对象:class 定义与对象实例化
理解面向对象的基本概念
在正式写代码之前,先搞清楚两个核心概念:类(Class) 和 对象(Object)。
类就像是一张设计图纸或者一个模具。它定义了某种事物的共同特征和行为。比如,你可以设计一个 Car 类,这个类会规定"汽车"必须有颜色、速度、品牌这些属性,还必须有"行驶"、"刹车"这些行为。
对象就是根据这张图纸实际制造出来的具体产品。当你基于 Car 类创建一个对象时,就得到了一辆真实的、可以驾驶的汽车——它有具体的颜色(比如红色),具体的速度(当前可能是 0),具体的品牌(比如"丰田")。
这两者的关系可以这样理解:类是抽象的模板,对象是具体的存在。一个类可以创建无数个对象,就像一张设计图可以造出无数辆车一样。
定义一个类
在 PHP 中,使用 class 关键字来定义类。类的基本结构包含属性(类的特征)和方法(类的行为)。
类的完整结构
class Car {
// 属性:描述类的特征
public $color;
public $brand;
public $speed = 0;
// 方法:描述类的行为
public function drive($speed) {
$this->speed = $speed;
echo "汽车以 {$this->speed} km/h 的速度行驶";
}
public function brake() {
$this->speed = 0;
echo "汽车已停止";
}
}
关键元素解析
属性声明:使用 $` 符号加上变量名来定义属性,前面的 `public` 是访问修饰符,表示这个属性可以从类的外部访问。除了 `public`,还有 `protected`(只能在类内部和子类访问)和 `private`(只能在类内部访问)。
**方法定义**:方法就是类里面的函数,使用 `function` 关键字定义。方法内部使用 `$this 关键字来引用当前对象,访问对象的属性或调用其他方法。
class User {
public $name;
public $email;
public function getInfo() {
return "姓名: {$this->name}, 邮箱: {$this->email}";
}
}
创建对象实例
类定义好之后,使用 new 关键字来创建对象实例。创建对象的过程也叫做"实例化"。
基本实例化语法
// 基于 User 类创建一个对象
$user1 = new User();
// 为对象的属性赋值
$user1->name = "张三";
$user1->email = "zhangsan@example.com";
// 调用对象的方法
echo $user1->getInfo();
执行以上代码会输出:姓名: 张三, 邮箱: zhangsan@example.com
创建多个对象
同一个类可以创建多个独立的对象,每个对象都有自己独立的属性值。
$user2 = new User();
$user2->name = "李四";
$user2->email = "lisi@example.com";
$user3 = new User();
$user3->name = "王五";
$user3->email = "wangwu@example.com";
$user1`、`$user2、`$user3` 是三个完全独立的对象,修改其中一个对象的属性不会影响其他对象。
---
## 构造函数:初始化对象
构造函数是一个特殊的方法,当对象被创建时,会自动调用这个方法。它通常用于设置对象的初始状态。
### 定义构造函数
在 PHP 中,构造函数的方法名是 `__construct`(注意前面有两个下划线)。
```php
class Product {
public $name;
public $price;
// 构造函数:创建对象时自动调用
public function __construct($name, $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo() {
return "商品: {$this->name}, 价格: ¥{$this->price}";
}
}
```
### 使用构造函数创建对象
```php
// 创建对象时直接传入参数
$product1 = new Product("手机", 2999);
$product2 = new Product("笔记本电脑", 5999);
echo $product1->getInfo();
echo $product2->getInfo();
```
使用构造函数的好处是:**创建对象的同时完成初始化**,确保对象创建后就能立即使用,无需再单独设置属性。
---
## 析构函数:清理资源
析构函数在对象被销毁时自动调用,用于执行清理工作,比如关闭数据库连接、释放资源等。
```php
class Database {
public $connection;
public function __construct($host, $dbname) {
// 模拟连接数据库
echo "连接到数据库: {$host}/{$dbname}\n";
$this->connection = "数据库连接对象";
}
// 析构函数:对象销毁时自动执行
public function __destruct() {
echo "数据库连接已关闭\n";
}
}
// 当脚本执行完毕,所有对象会被销毁,析构函数自动调用
$db = new Database("localhost", "myapp");
echo "业务逻辑处理中...\n";
执行结果:
连接到数据库: localhost/myapp
业务逻辑处理中...
数据库连接已关闭
---
## 完整示例:学生信息管理系统
下面通过一个完整的示例,演示如何综合运用类的定义和对象实例化。
```php
class Student {
public $name;
public $age;
public $grade;
public function __construct($name, $age, $grade) {
$this->name = $name;
$this->age = $age;
$this->grade = $grade;
}
public function study() {
return "{$this->name} 正在努力学习";
}
public function exam($subject) {
return "{$this->name} 正在参加 {$subject} 考试";
}
public function getInfo() {
return "姓名: {$this->name}, 年龄: {$this->age}, 年级: {$this->grade}";
}
}
// 创建学生对象
$student1 = new Student("小明", 16, "高一");
$student2 = new Student("小红", 17, "高二");
// 使用对象
echo $student1->getInfo() . "\n";
echo $student1->study() . "\n";
echo $student2->exam("数学") . "\n";
输出结果:
姓名: 小明, 年龄: 16, 年级: 高一
小明 正在努力学习
小红 正在参加 数学 考试
访问修饰符的区别
前面提到属性和方法可以使用 public、protected、private 三种访问修饰符,它们决定了属性和方法的访问范围。
| 修饰符 | 访问范围 |
|---|---|
public |
任何位置都可以访问 |
protected |
只能在类本身和子类中访问 |
private |
只能在类本身内部访问 |
class Person {
public $publicName = "公开属性";
protected $protectedAge = 25;
private $privateId = "ID12345";
public function showAll() {
// 在类内部可以访问所有属性
echo "公开: {$this->publicName}\n";
echo "保护: {$this->protectedAge}\n";
echo "私有: {$this->privateId}\n";
}
}
$person = new Person();
// 这些可以正常访问
echo $person->publicName . "\n";
$person->showAll();
// 以下访问会报错(已注释)
// echo $person->protectedAge; // 错误:无法从外部访问
// echo $person->privateId; // 错误:无法从外部访问
```
---
## 关键要点总结
**类的定义**使用 `class` 关键字,包含属性(变量)和方法(函数)。访问修饰符控制属性的可见性,建议将属性设置为 `private` 或 `protected`,通过公共方法来访问和修改,这样更安全。
**对象实例化**使用 `new` 关键字,每次实例化都会创建一个独立的对象。构造函数 `__construct` 用于初始化对象,析构函数 `__destruct` 用于清理资源。
**`$this` 关键字**在方法内部引用当前对象,访问对象的属性或调用其他方法。记住:`$this` 只能用在对象上下文中,不能用在静态方法中。
暂无评论,快来抢沙发吧!