1. 接口
<?php
// 接口: 接口中有两个成员[接口常量, 公共抽象方法]. 接口定义的方法必须在子类(实现类)中全部实现
interface iTestDemo
{
// 接口常量
const INTERFACR_NAME = 'iTestDemo';
// 构造函数
public function __construct(...$ages);
//公共抽象方法1
public function funcName(): string;
//公共抽象方法2
public static function metName(): string;
}
class TestDemo implements iTestDemo
{
public function funcName(): string
{
return __FUNCTION__;
}
public static function metName(): string
{
return __METHOD__;
}
public function __construct(...$ages) { }
}
// 调用方法
echo (new TestDemo())->funcName(), '<br>';
// 调用静态方法
echo TestDemo::metName(), '<br>';
// 调用接口常量1
echo TestDemo::INTERFACR_NAME, '<br>';
// 调用接口常量2 -- 推荐方式,用接口调用
echo iTestDemo::INTERFACR_NAME, '<br>';
2. 抽象类
// 抽象类: 由abstract关键字修饰, 抽象类中的抽象方法必须在子类(实现类)中全部实现. 不可实例化. 只要是类中存在抽象方法,这个类就是抽象类
abstract class aTestDemo
{
// 构造函数
public function __construct(...$ages)
{
}
//公共抽象方法1
public function funcName(): string
{
return __CLASS__ . '=====>' . __FUNCTION__;
}
//公共抽象方法2
abstract public static function metName(): string;
// {
// return __CLASS__ . '=====>' . __FUNCTION__;
// }
}
class TestDemo2 extends aTestDemo
{
public static function metName(): string
{
return __CLASS__ . '=====>' . __FUNCTION__;
}
}
// 调用方法
echo (new TestDemo2())->funcName(), '<br>';
// 调用抽象方法
echo TestDemo2::metName(), '<br>';
3. 区别
类别 | 是否可以定义变量 | 是否可以定义常量 | 是否可以实例化 | 是否可以使用构造函数 | 是否可以定义实例方法 | 是否可以继承 | 实现类是否必须要全部实现父级的方法 | 是否只能使用public修饰符 |
---|---|---|---|---|---|---|---|---|
抽象类 | true | true | false | true | true | true | false | false |
接口 | false | false | false | true | false | true | true | true |
另外, 接口可以实现多继承, 而抽象类只能继承一个.