从应用角度来讲
接口:
/**
* 接口是一种特殊的抽象类
* 只能用public修饰,只能存放常量,只能约定方法不能约定方法体
*/
interface InterfaceDemo {
//只能放常量
const STATUS = 1;
//只能约定方法不能约定方法体
public function show();
}
interface InterfaceDemoTwo {
//只能放常量
const STATUS_TWO = 2;
//只能约定方法不能约定方法体
public function showTwo();
}
//接口实现通过关键字implements去实现,同时可以进行多个接口继承
class SonDemo implements InterfaceDemo, InterfaceDemoTwo {
//来自接口InterfaceDemo
public function show()
{
return self::STATUS;
// InterfaceDemo 中的方法
}
//来自接口InterfaceDemoTwo
public function showTwo()
{
//self会找到当前接口中的常量
return self::STATUS_TWO;
// InterfaceDemo1 中的方法
}
}
$demo = new SonDemo();
echo $demo->show();
echo $demo->showTwo();
echo PHP_EOL;
抽象类:
/**
* 定义抽象类需要用abstract关键字修饰
* 定义的抽象类不能直接使用,必须通过继承才能使用
* 如果类中有任何一个方法是抽象声明的,那这个类必须是抽象类。
* 抽象类中的抽象方法不能写方法实体,例如:abstract public function getName()
* 抽象类中可以写普通方法,例如:public function show(){...}
* 抽象类中声明权限,子类继承时应该>=父类中的权限,如父protected声明过后的,子类必须是>=protected声明级别的
* 抽象类中的抽象方法必须由子类重写
*/
abstract class abstractDemo
{
//属性
protected $name;
public $age;
private $sex;
//非抽象方法 构造函数
public function __construct($info = [])
{
$this->name = $info['name'];
$this->age = $info['age'];
$this->sex = $info['sex'];
}
//抽象方法,抽象方法必须由子类重写!
abstract public function getAge();
//抽象方法,抽象方法必须由子类重写!
abstract public function setAge($age);
/**
* 普通方法,非抽象方法,类似于普通类中的方法,子类可以集成或重写
*/
public function showInfo()
{
echo '名字:'.$this->name.'年龄:'.$this->age.'性别:'.$this->sex.PHP_EOL;
}
}
/**
* 抽象类必须由子类集成才能使用
* extends完成继承,只能进行一个抽象类的集成不能进行多个抽象类的继承
*/
class SonDemo extends abstractDemo
{
/**
* 子类的构造函数
*/
public function __construct($info = [])
{
//TODO:子类要做的事情,我这里没有定义子类要做的事情,只是调用了父类
//子类构造函数的参数拿到以后交给父类
parent::__construct($info);
}
public function showInfo()
{
echo '我收到了小红的信息:'.$this->age.PHP_EOL;
parent::showInfo();
}
public function setAge($age)
{
//拿到父类中的属
$this->age = $age;
}
public function getAge()
{
echo '年龄:'.$this->age.PHP_EOL;
}
}
$info = [
'name' => '小红',
'age' => 18,
'sex' => '女',
];
$demo = new SonDemo($info);
$demo->showInfo();
$demo->setAge(26);
$demo->showInfo();
$demo->getAge();