在 PHP 中,接口(Interface)和抽象类(Abstract Class)都是用于实现面向对象编程的重要概念,但它们之间有一些重要的区别。以下是它们的主要区别:
接口(Interface)
-
定义方法:
- 接口只能定义方法的签名(即方法名、参数列表和返回类型),不能提供方法的具体实现。
- 所有方法都必须是
public的。
-
多继承:
- 一个类可以实现多个接口,这使得接口可以实现多继承的效果。
- 使用
implements关键字来实现接口。
-
强制实现:
- 实现接口的类必须实现接口中定义的所有方法,否则会报编译错误。
-
常量:
- 接口中可以定义常量,这些常量在实现类中是不可修改的。
抽象类(Abstract Class)
-
定义方法:
- 抽象类可以定义抽象方法(没有具体实现的方法),也可以定义具体方法(有具体实现的方法)。
- 抽象方法必须在子类中被实现,而具体方法可以直接在抽象类中实现。
-
单继承:
- 一个类只能继承一个抽象类,不能实现多继承。
- 使用
extends关键字来继承抽象类。
-
属性:
- 抽象类可以定义属性,包括私有、保护和公共属性。
-
构造函数:
- 抽象类可以有构造函数,子类在构造时会调用父类的构造函数。
示例代码
接口示例
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "汪汪";
}
}
class Cat implements Animal {
public function makeSound() {
echo "喵喵";
}
}
$dog = new Dog();
$dog->makeSound(); // 输出: 汪汪
$cat = new Cat();
$cat->makeSound(); // 输出: 喵喵
抽象类示例
abstract class Animal {
abstract public function makeSound();
public function eat() {
echo "吃东西";
}
}
class Dog extends Animal {
public function makeSound() {
echo "汪汪";
}
}
class Cat extends Animal {
public function makeSound() {
echo "喵喵";
}
}
$dog = new Dog();
$dog->makeSound(); // 输出: 汪汪
$dog->eat(); // 输出: 吃东西
$cat = new Cat();
$cat->makeSound(); // 输出: 喵喵
$cat->eat(); // 输出: 吃东西
总结
- 接口:主要用于定义一组行为规范,允许多个类实现相同的接口,实现多继承。
- 抽象类:主要用于提供一个基类,包含一些通用的方法实现和属性,子类可以继承并扩展。

被折叠的 条评论
为什么被折叠?



