PHP里面的抽象类和接口类

PHP里面的抽象类和接口类的定义,以及两者之前的区别和联系

在 PHP 中,抽象类(abstract class) 和 接口类(interface) 是两种用于定义类行为和结构的工具。它们有着相似之处,但也有很多关键的不同点。
抽象类(Abstract Class)

定义:

抽象类是不能被直接实例化的类,通常用来作为其他类的基类。它可以包含 抽象方法(没有实现的方法)和 具体方法(已经实现的方法)。子类必须实现抽象类中所有的抽象方法,除非子类也是抽象类。

复制代码
abstract class Animal {
    // 抽象方法 (没有实现)
    abstract public function makeSound();

    // 具体方法
    public function sleep() {
        echo "Sleeping\n";
    }
}

特点:

  • 抽象类可以有 抽象方法 和 具体方法。
  • 抽象类不能直接实例化,必须通过继承后实现抽象方法。
  • 抽象类可以有 成员变量 和 常量。
  • 抽象类可以继承自其他类,也可以被其他类继承。
  • 可以实现方法的默认行为,子类可继承或重写。

用法:

  • 适用于共享部分代码、但又强制要求子类必须实现某些方法的情况。
  • 抽象类可以包含构造函数、属性和方法。

示例

复制代码
abstract class Animal {
    abstract public function makeSound();

    public function sleep() {
        echo "The animal is sleeping.\n";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "Woof!\n";
    }
}

$dog = new Dog();
$dog->makeSound();  // 输出:Woof!
$dog->sleep();      // 输出:The animal is sleeping.

接口(Interface)
定义:

接口是一种完全抽象的类。接口只能包含方法的声明(没有方法的实现),所有在接口中声明的方法,必须由实现接口的类来定义具体的实现。接口只能被 类 实现,不能被实例化。

复制代码
interface Animal {
    public function makeSound();
}

特点:

  • 接口只能包含 方法声明,不能包含具体实现。
  • 一个类可以实现多个接口,但只能继承一个抽象类(PHP 不支持多重继承)。
  • 接口中的方法默认是 public 的,且不能包含任何访问控制修饰符(如 private 或 protected)。
  • 接口不能有成员变量,只能有常量。

用法:

  • 适用于定义一组方法的 契约,让不同的类可以遵循相同的接口。
  • 接口适用于不需要共享任何实现代码、只定义行为规范的场景。

示例:

复制代码
interface Animal {
    public function makeSound();
}

class Dog implements Animal {
    public function makeSound() {
        echo "Woof!\n";
    }
}

$dog = new Dog();
$dog->makeSound();  // 输出:Woof!

抽象类与接口类的区别与联系
区别:

特性 抽象类 接口
是否能有方法实现 可以有方法实现(具体方法) 不能有方法实现,只能有方法声明
继承方式 类只能继承一个抽象类(单继承) 类可以实现多个接口(多实现)
成员变量 可以有成员变量 不能有成员变量
构造函数 可以有构造函数 不能有构造函数
访问修饰符 可以使用访问修饰符(如 public, protected, private) 方法默认是 public,不能有访问修饰符
适用场景 当需要共享一些实现代码,并强制子类实现一些方法时使用 当只关心方法的声明,而不关心实现时使用

联系:

  • 都不能直接实例化:抽象类和接口都不能直接实例化,需要由其他类继承或实现。
  • 都用于强制子类/实现类提供特定功能:抽象类通过继承来强制子类实现方法,而接口通过实现强制类实现特定的方法。
  • PHP 中都可以用来定义规范:无论是抽象类还是接口,都可以用来定义类应该遵循的行为。

总结

  • 抽象类 更适合需要共享代码和实现部分方法的情况,它能提供默认的实现,子类可以选择继承或者重写这些方法。
  • 接口 更适合定义不相关类之间应该遵循的行为规范,它仅定义了一组方法,强制子类实现,但不关心如何实现。

在实际应用中,选择使用抽象类还是接口,取决于代码复用和扩展的需求。如果不同的类有相似的实现,使用抽象类;如果类之间没有任何实现上的关系,但需要遵循相同的行为规范,则使用接口。

相关推荐
ServBay16 小时前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户9623779544818 小时前
CTF 伪协议
php
BingoGo3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack6 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php