1、抽象类
先看一段代码:
<?php
abstract class A
{
abstract public function getName($name);
public function getWeight()
{
echo '200kg';
}
}
abstract class B extends A
{
abstract public function getSex();
}
class C extends B
{
public function getName($name, $age='未知')
{
echo '年龄:'. $age . ' 姓名:' . $name;
}
public function getSex()
{
// TODO: Implement getName() method.
}
public function getAge()
{
}
}
(new C())->getWeight();
(new C())->getName('lili');
抽象类有以下特点:
- 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。定义为抽象的类不能被实例化,被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。 例如上边的例子:被abstract关键字修饰的类中的abstract方法,没有{}函数体。
- 继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法; 例如上边的例子, class C 继承B, 必须实现B和A中所有的抽象方法。
另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。 - 方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数(例如,class C中的getName方法中的$age参数),而父类抽象方法的声明里没有,则两者的声明并无冲突。
二、接口
先简单看一个接口和其实现的例子:
<?php
interface Study
{
public function StudyEn();
public function StudyCn();
}
interface Play
{
public function PlayBall();
public function PlayGame();
}
class A implements Study,play
{
public function StudyCn()
{
echo 'StudyCn';
}
public function StudyEn()
{
echo 'StudyEn';
}
public function playBall()
{
echo 'playBall';
}
public function playGame()
{
echo 'playGame';
}
public function StudyJa()
{
echo 'StudyJa';
}
}
(new A())->playGame();
发现了什么?
发现接口有如下特点:
- 定义使用的interface关键字定义,实现使用implements关键字实现
- 接口中定义的所有方法都必须是公有的,并且是空方法。
- 接口中也可以定义常量
- 非抽象类中必须实现接口中定义的所有方法
- 类可以实现多个接口,用逗号来分隔多个接口的名称
- 接口也可以继承,通过使用 extends 操作符。
- 可以同时继承抽象类和实现接口,extends要写在前面
所有他俩有啥区别呢?
简单说,就是抽象类定义了一个类的标准规范,就是继承这个抽象类的属于哪个群体。接口定义的是类需要实现的哪些功能。使用过程的区别上边讲的很详细了。