📜  PhP oops抽象类和接口之间的差异(1)

📅  最后修改于: 2023-12-03 15:03:35.517000             🧑  作者: Mango

PHP OOPs 抽象类和接口之间的差异

在 PHP 面向对象编程中,抽象类和接口是两个重要的概念。虽然它们都用于实现代码重用和建立代码架构,但是它们之间有一些差异,需要开发者理解它们之间的不同点。

抽象类

一个抽象类是不能直接实例化的类,而且它的目的是为了被子类继承。子类必须实现该抽象类中所有声明为抽象的方法,否则子类也必须声明为抽象类。抽象类可以包含非抽象的方法和属性。

特点:

  • 抽象类中可以定义属性和方法
  • 抽象类中可以定义非抽象方法和抽象方法
  • 抽象类中的抽象方法必须在子类中被实现
  • 抽象类可以通过继承来复用代码

下面是一个抽象类的例子:

//抽象类
abstract class AbstractClass
{
    //一个抽象方法
    abstract protected function getValue();

    //普通方法
    public function printValue()
    {
        print $this->getValue() . "<br/>";
    }
}

//子类
class ConcreteClass1 extends AbstractClass
{
    protected function getValue()
    {
        return "ConcreteClass1";
    }
}

//子类
class ConcreteClass2 extends AbstractClass
{
    protected function getValue()
    {
        return "ConcreteClass2";
    }
}

$obj1 = new ConcreteClass1(); //实例化对象
$obj1->printValue(); //输出: ConcreteClass1

$obj2 = new ConcreteClass2(); //实例化对象
$obj2->printValue(); //输出: ConcreteClass2

上面的例子中,AbstractClass 是一个抽象类,其中声明了一个抽象方法和一个普通方法。子类 ConcreteClass1ConcreteClass2 继承了 AbstractClass 类,并实现了抽象方法 getValue(),以及不同的返回结果。

接口

一个接口是由一组抽象方法和常量组成的,它不能有实现代码。只有表示实现该接口的类中实现了接口中的所有方法时,该类才能实例化。一个类可以实现多个接口。

特点:

  • 接口中只能定义常量和抽象方法
  • 接口中的所有方法都是抽象方法
  • 接口不能包含变量和方法的实现
  • 接口可以被多个类实现,一个类可以实现多个接口
  • 接口可以被抽象类实现

下面是一个接口的例子:

//接口
interface Animal
{
    public function makeSound(); //抽象方法
}

//实现接口的类
class Cat implements Animal
{
    public function makeSound()
    {
        echo "Meow";
    }
}

//实现接口的类
class Dog implements Animal
{
    public function makeSound()
    {
        echo "Bark";
    }
}

$animals = array(new Cat(), new Dog()); //实例化对象
foreach($animals as $animal){
    $animal->makeSound(); //输出: Meow Bark
}

上面的例子中,Animal 是一个接口,其中声明了一个抽象方法。类 CatDog 实现了这个接口,并实现了 makeSound() 方法,输出不同的结果。

抽象类和接口之间的差异
1.作用不同

抽象类是为那些共享一些通用功能的类而设计的,并提供了一个基础类供子类继承。抽象类也可以包含非抽象方法和属性。

而接口是为了实现一组相似功能的类而设计的,并规定了一组方法,并且没有实现代码和属性。

2.继承与实现不同

一个类只能继承一个抽象类,并且一个类只能扩展一个类,而一个类可以实现多个接口。

通常来说,如果存在类之间共享的代码或状态,并且需要扩展或更改这个共享代码或状态,那么就应该使用抽象类;如果类需要实现一组方法,而这些方法不必实现特定的代码或状态,那么就应该使用接口。

3.代码重用

由于抽象类可以包含非抽象的方法和属性,因此它们可以通过继承来重用代码。而接口不包含实现代码和属性,只能通过实现多个接口来重新使用代码。

总结

抽象类和接口都是用于实现代码重用和建立代码架构。抽象类和接口之间的差异在于它们的作用不同,继承和实现不同,以及代码重用的方式不同。在选择抽象类和接口时,应该根据具体情况来确定使用哪种方法,以实现最佳效果。