PHP面向对象编程(OOP):类、对象与属性

好的,各位程序猿、程序媛们,欢迎来到我的PHP OOP课堂!今天我们要聊的是PHP面向对象编程(OOP)这块“骨头”里最核心的“肉”:类、对象与属性。别怕,听名字挺唬人,其实就像谈恋爱,类是蓝图,对象是实体,属性就是你的闪光点!准备好,我们要开始一场“对象”寻觅之旅啦!🚀

课程大纲

  1. OOP 的魅力: 为什么我们要“面向对象”?
  2. 类:对象的蓝图
    • 类的定义与语法
    • “盖房子”的比喻:类与对象的类比
  3. 对象:类的实例
    • 对象的创建与使用
    • “克隆羊多莉”:对象的实例化
  4. 属性:对象的特征
    • 属性的定义与访问
    • “颜值、才华、身高”:属性的类型与作用域
  5. 实战演练:一个简单的用户类
    • 从需求到代码:一步步构建用户类
    • “麻雀虽小,五脏俱全”:用户类的基本功能
  6. 进阶:属性的访问控制
    • public、protected、private:保护你的“隐私”
    • “防火墙”:访问控制的重要性
  7. 总结与练习

1. OOP 的魅力:为什么我们要“面向对象”?

想象一下,你要做一个复杂的程序,就像建造一座摩天大楼。如果你用传统的“面向过程”方法,就像用一堆零散的砖头、钢筋,自己一点点堆砌。累死累活不说,稍有不慎,整栋楼就塌了!😱

而OOP就像模块化建造,把大楼分成一个个独立的“模块”(对象),每个模块有自己的功能(方法)和特征(属性)。你可以重复使用这些模块,方便维护和扩展。

OOP 的优点:

  • 代码重用性高: 就像乐高积木,可以重复使用。
  • 易于维护: 修改一个模块,不会影响其他模块。
  • 可扩展性强: 就像盖楼,可以不断往上加层。
  • 更贴近现实: 把现实世界的事物抽象成对象,更易于理解和建模。

简而言之,OOP就是一种更高效、更优雅的编程方式,让你从“码农”变身“架构师”!😎

2. 类:对象的蓝图

2.1 类的定义与语法

类是对象的蓝图或模板。它定义了对象应该具有的属性和方法。在PHP中,使用class关键字来定义一个类。

class MyClass {
    // 属性 (variables)
    public $name;
    public $age;

    // 方法 (functions)
    public function sayHello() {
        echo "Hello, my name is " . $this->name . " and I am " . $this->age . " years old.";
    }
}

语法说明:

  • class MyClass: 声明一个名为MyClass的类。
  • public $name;: 定义一个公共属性name,可以被任何地方访问。
  • public function sayHello(): 定义一个公共方法sayHello,可以被对象调用。
  • $this: 一个特殊变量,指向当前对象。

2.2 “盖房子”的比喻:类与对象的类比

把类想象成建筑设计图纸,它详细描述了房子的结构、尺寸、材料等等。而对象就是根据图纸盖出来的房子,每一栋房子都是一个独立的实体。

表格对比:

特征 类(图纸) 对象(房子)
定义 描述对象的属性和方法 类的具体实例
存在形式 抽象的概念 具体的实体
数量 一个 可以有多个
作用 创建对象 提供服务

3. 对象:类的实例

3.1 对象的创建与使用

对象是类的具体实例。要创建一个对象,需要使用new关键字。

$myObject = new MyClass(); // 创建一个MyClass的对象

$myObject->name = "Alice";  // 设置对象的属性
$myObject->age = 30;

$myObject->sayHello();     // 调用对象的方法

代码解释:

  • $myObject = new MyClass();: 创建一个MyClass类的对象,并赋值给变量$myObject
  • $myObject->name = "Alice";: 使用->操作符访问对象的属性,并设置name属性的值为"Alice"。
  • $myObject->sayHello();: 使用->操作符调用对象的方法sayHello()

3.2 “克隆羊多莉”:对象的实例化

对象的实例化就像克隆羊多莉,你有一个“母版”(类),然后通过new操作符“克隆”出多个“小羊”(对象)。每个“小羊”都有自己的独立特征(属性),即使它们都来自于同一个“母版”。

$user1 = new User();
$user1->name = "Bob";
$user1->email = "[email protected]";

$user2 = new User();
$user2->name = "Charlie";
$user2->email = "[email protected]";

// $user1 和 $user2 是两个独立的对象,它们有各自的属性值

4. 属性:对象的特征

4.1 属性的定义与访问

属性是对象的状态或特征。它们是类中定义的变量,用于存储对象的数据。

class Car {
    public $color;     // 颜色
    public $brand;     // 品牌
    public $engineType; // 引擎类型
}

访问属性:

  • 使用->操作符访问对象的属性。
  • 属性的访问权限由其访问修饰符决定(public, protected, private)。

4.2 “颜值、才华、身高”:属性的类型与作用域

把属性想象成人的颜值、才华、身高。不同的对象,这些属性的值可能不同。

属性类型:

PHP中的属性可以是任何数据类型,例如:

  • string: 字符串 (e.g., "Alice")
  • int: 整数 (e.g., 30)
  • float: 浮点数 (e.g., 1.75)
  • bool: 布尔值 (e.g., true)
  • array: 数组
  • object: 对象

属性作用域:

属性的作用域决定了它们可以被访问的范围。PHP有三种访问修饰符:

  • public: 公共的,可以在任何地方访问。
  • protected: 受保护的,只能在类内部及其子类中访问。
  • private: 私有的,只能在类内部访问。

5. 实战演练:一个简单的用户类

5.1 从需求到代码:一步步构建用户类

假设我们要创建一个用户类,用于存储用户的基本信息:

需求:

  • 用户应该有姓名、邮箱和密码。
  • 用户可以注册、登录和修改密码。

代码实现:

class User {
    public $name;
    public $email;
    private $password;

    public function __construct($name, $email, $password) {
        $this->name = $name;
        $this->email = $email;
        $this->password = password_hash($password, PASSWORD_DEFAULT); // 加密存储密码
    }

    public function login($email, $password) {
        if ($this->email === $email && password_verify($password, $this->password)) {
            echo "Login successful!";
            return true;
        } else {
            echo "Login failed!";
            return false;
        }
    }

    public function changePassword($oldPassword, $newPassword) {
        if (password_verify($oldPassword, $this->password)) {
            $this->password = password_hash($newPassword, PASSWORD_DEFAULT);
            echo "Password changed successfully!";
            return true;
        } else {
            echo "Incorrect old password!";
            return false;
        }
    }
}

代码解释:

  • __construct(): 构造函数,在创建对象时自动调用,用于初始化对象的属性。
  • password_hash(): PHP内置函数,用于加密密码。
  • password_verify(): PHP内置函数,用于验证密码。

5.2 “麻雀虽小,五脏俱全”:用户类的基本功能

虽然这个用户类很简单,但它已经包含了OOP的基本要素:类、对象、属性和方法。你可以根据实际需求,不断扩展它的功能。

$user = new User("John Doe", "[email protected]", "password123");

$user->login("[email protected]", "password123"); // 输出 "Login successful!"

$user->changePassword("password123", "newPassword"); // 输出 "Password changed successfully!"

6. 进阶:属性的访问控制

6.1 public、protected、private:保护你的“隐私”

访问控制就像给属性设置“防火墙”,防止被随意访问和修改。

表格对比:

访问修饰符 访问范围 作用
public 任何地方都可以访问 公开的属性,所有人都可以访问和修改
protected 类内部及其子类中可以访问 受保护的属性,只能在类内部及其子类中访问和修改
private 只能在类内部访问 私有的属性,只能在类内部访问和修改,外部无法直接访问

6.2 “防火墙”:访问控制的重要性

  • 数据安全: 保护敏感数据,例如密码,防止被恶意篡改。
  • 代码封装: 隐藏内部实现细节,只暴露必要的接口。
  • 可维护性: 降低代码的耦合度,方便维护和修改。

示例:

在上面的用户类中,我们将密码属性设置为private,防止外部直接访问和修改密码,保证了数据的安全性。

7. 总结与练习

恭喜你,完成了今天的OOP之旅!🎉 我们学习了类、对象、属性的概念,以及如何使用它们来构建简单的PHP程序。

总结:

  • 类是对象的蓝图,对象是类的实例,属性是对象的特征。
  • 使用new关键字创建对象。
  • 使用->操作符访问对象的属性和方法。
  • 使用publicprotectedprivate控制属性的访问权限。

练习:

  1. 创建一个Product类,包含属性:name(产品名称)、price(价格)、description(描述)。
  2. Product类添加方法:displayInfo()(显示产品信息)。
  3. 创建多个Product对象,并调用displayInfo()方法显示产品信息。
  4. 尝试使用不同的访问修饰符,观察属性的访问权限。

希望今天的课程对你有所帮助!记住,OOP不是一蹴而就的,需要不断实践和学习。下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注