PHP基础:面向对象二(类,对象,对象的组成,特性及修饰符)

什么是类

人类,车类,猫类,狗类…这些不是具体的某个事物,而是某类事物的总称,可以称之为类

什么是对象

张三,李四,还有那只名为芬达的猫咪,这些具象的事物,真实存在的事物,就可以称之为对象,万物皆为对象

类与对象的关系

看样子是所属的,张三,李四都是人类,芬达是猫类,所以你说张三和李四是人类并没有错,但当你在大街上想要找一个人类时,所有人都可以答应,但当你想要确定找某一个人的时候,你就必须称呼他的名称,才能找到这个人,在编程中,我们称呼这个过程为实例化,即对象是类实例化过来的

面向对象的修饰符

面向对象编程中的修饰符是用于控制类的成员(属性和方法)的访问权限和行为的关键字。修饰符可以限制对类的成员的访问,以确保数据的封装性和安全性,并提供更好的代码组织和维护。

  • public(公开的)
    • 该修饰符修饰的属性和方法可以在任意地方调用,包括类内和类外
    • 这也是默认的访问级别,若属性或方法并未加修饰符的话,那默认都是公开级别
  • protected(受保护的)
    • 该修饰符修饰的属性和方法只能在当前类内和当前类的子类中访问,类外不可以访问
  • private(私有的)
    • 该修饰符修饰的属性和方法只能在当前类内访问,子类及类外均不可访问
    • 该级别最为严格,在不考虑魔术方法的情况下,该级别可以保证属性和方法不被外部代码修改

对象的组成

对象是由成员属性成员方法组成,何为成员属性?像是一个人的名字,性别等用来描述这个人的信息,我们就可以称之为属性。那何为成员方法呢?这个人能唱歌,跳舞,吃饭,睡觉,这些行为即可称之为成员方法

  • 成员属性
    • 描述:本质其实就是一个变量,用于存储这个类有关的一些信息
    • 理解:像是人类,基本上都有的一些属性,比如姓名,性别,年龄,身高,体重…这些对人类的描述,都可以理解为成员属性
  • 成员方法
    • 描述:本质其实就是一个函数,用于实现这个类的功能
    • 理解:还是人类,基本上都能干的一些事情,比如吃饭,睡觉,做白日梦等,这些能做的事情,都可以理解为成员方法

面向对象的三大特征

封装

官方描述:封装是指将数据和操作数据的方法封装在一个类中,通过访问修饰符(public、protected、private)来控制对类成员的访问权限。封装可以隐藏实现细节,提供对外部的统一接口,增加代码的可维护性和安全性。

封装可以带来的好处:

  • 信息隐藏:封装其实隐藏了类内部的细节,只暴露出有限的接口,这样外部调用者只能通过公开的方法来调用对象中的属性和方法,不需要了解对象内部的实现过程,降低了代码的耦合度
  • 代码重用:通过继承,可以重复使用父类中的公开和受保护的属性和方法,从而减少代码冗余,并可以在子类中扩展和修改功能

人类有姓名这个公开的属性,也有吃饭这个公开的方法,而我们需要指定一个人来帮我们吃掉一些东西,那就需要调用这个人姓名的属性 和吃饭的方法,但这个人吃饭的这个方法可能是基于他一些受保护或是私有的方法来实现的(比如说需要嘴的咀嚼,胃的蠕动消化)而这些在外部调用者看来并没有实际的用处,下面是示例代码

class Person
{
    public $name; // 公共属性 姓名
    protected $age; // 受保护的属性 年龄
    private $salary; // 私密的属性 工资

    public function __construct(string $name, int $age, int $salary)
    {
        $this->name = $name;
        $this->age = $age;
        $this->salary = $salary;    
    }

    public function eat()
    {
        return $this.name . '在吃东西';    
    }
}
$person = new Person("Alice", 30, 50000);
echo $person->name; // 可以访问公共属性
echo $person->eat(); // 可以访问公共方法
// echo $person->age; // 不能访问受保护属性
// echo $person->salary; // 不能访问私有属性

继承

官方描述:继承是指通过一个已存在的类创建一个新类,新类继承了原有类的属性和方法,并可以在此基础上进行扩展和修改。继承可以实现代码的重用,减少重复编写相似的代码,提高代码的可扩展性和可维护性。

详细内容

  • 继承的特性:
    • 子类可以使用父类所有的public和protected的属性和方法,但不能使用private的属性和方法
    • 子类可以重写(覆盖)父类的方法,这可以用来实现当前子类的某些功能,重写父类方法时,子类的方法名,参数及访问修饰符必须与父类被重写的方法一致或更为宽松
    • 子类可以通过 parent:: 来调用父类的方法和构造函数(__construct)
  • 构造函数和析构函数的继承:
    • 子类是可以继承父类的构造方法和析构方法,如果子类没有自己的构造和析构方法的话,那么就会自动调用父类的构造和析构方法
    • 如果子类需要自己的构造方法,那么可以在子类中定义构造方法来覆盖父类的,并在子类的构造方法中使用代码 parent::__construct 来调用父类的构造方法
  • 多重继承:PHP不支持多继承,即1个类不能同时继承多个类,但可以使用interface来实现类似多继承的场景

可以通过性别区分男人和女人,这是2个不同的类,但是他们都有人类的特征,但不管男人还是女人,都属于人类,在面向对象中的他们就需要同时继承人类这个类别,下面是示例代码

// 员工类
class Employee extends Person
{
    public function getAge()
    {
        return $this->age; // 子类可以访问父类公共的和受保护的属性,但不可访问父类私有的属性
    }
}

$employee = new Employee("Bob", 25, 60000);
// echo $employee->age; // 不能访问受保护属性
echo $employee->getAge(); // 可以通过子类方法访问受保护属性

多态

官方描述:多态是指同一种操作作用于不同的对象,可以产生不同的行为结果。在面向对象编程中,多态可以通过方法的重写和方法的重载来实现。方法的重写(Override)是指子类重新定义父类的方法,实现自己的特定功能;多态提高了代码的灵活性和扩展性,使代码更具通用性。

假设我们现在有3个类,分别是animal(动物类),cat(猫类)和dog(狗类),cat和dog都继承了animal,animal中有一个名为makeSound(发出声音)方法,而cat和dog由于发出的声音并不同,所以这2个子类对这个方法都进行了重写,重写的方法名在不同类中有不同的实现方式,即多态的体现。代码如下

// 动物抽象类
abstract class Animal
{
    abstract public function makeSound();
}

// 猫类
class Cat extends Animal
{
    public function makeSound()
    {
        return 'cat';    
    }
}

// 狗类
class Dog extends Animal
{
    public function makeSound()
    {
        return 'dog';    
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!