php 抽象类和接口的区别
1. 抽象类
不能被实例化
在类中 只要有一个方法被定义为抽象的,那么这个 类就必须加上abstract关键字 成为抽象类
抽象方法只声明其调用方式,不能定义具体功能实现
子类必须定义父类中的所有抽象方法,方法的访问控制符必须和父类一致或者更为宽松
子类实现的抽象方法可以增加参数但必须有默认值。
abstract class A {
public function show(){
$this->getName();
echo PHP_EOL;
}
protected abstract function getName();
public abstract function getAge($age);
}
class ChildA1 extends A {
public function getName(){
echo "I'm ChildA1";
}
public function getAge($age){
echo "Age is " . $age;
}
}
class ChildA2 extends A {
protected function getName(){
echo "I'm ChildA2";
}
public function getAge($age, $year = ''){
echo "Age is ". $age . ', bron ' . $year;
}
}
$ca1 = new ChildA1();
$ca1->show();
$ca1->getAge(18);
$ca2 = new ChildA2();
$ca2->show();
$ca2->getAge(20, 2000);
2. 接口
类中必须实现接口中定义的所有方法
可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容
接口中所有方法都 必须是公有
类 可以实现多个接口,用逗号来分隔多个接口的名称
接口 可以继承,通过使用 extends 操作符
接口 可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖
interface B1 {
const B1_NAME = 'Interface B1';
function getName();
function getAge($age);
}
interface B2 extends B1 {
function show();
}
interface B3 {
function getSchool();
}
class ChildB implements B2, B3{
function getName(){
echo "I'm ChildB";
}
function getAge($age, $year = ''){
echo "Age is " . $age;
}
function show(){
$this->getName();
echo PHP_EOL;
$this->getAge(23, 1997);
echo PHP_EOL;
echo self::B1_NAME;
echo PHP_EOL;
}
function getSchool(){
echo "study in Peking University";
echo PHP_EOL;
}
}
$b = new ChildB();
$b->show();
$b->getSchool();
2. 抽象类和接口的区别
抽象类的 子类遵循继承原则,只能有一个父类;但一个类可以实现多个接口
抽象类中可以 有非抽象的已经实现的方法;接口不可以
抽象类中 方法和变量的访问控制自己定义;接口只能是 公共的

浙公网安备 33010602011771号