接口and抽象类
代码示例:
// 接口
/*
接口方法不能用 public private protected static abstract final 等修饰词修饰
系统会将方法指定死为 public abstract
成员属性只能是静态常量 const
接口可以多继承 implements N
*/
interface Obj
{
// static $name = 'fantasy'; //Interfaces may not include member variables
const Name = 'fantasy';
function get();
function set();
function del();
}
abstract class R implements Obj
{
// 实现接口的部分抽象方法 此类变成了抽象类
function get(){}
}
class Router extends R
{
// 实现剩余的抽象方法
function set(){}
function del(){}
}
// 抽象类
/*
抽象类(abstract class class_name)里面至少有一个抽象方法(abstract function func_name(); 没有abstract修饰的方法 function func_name(); 会报错 说方法没有结构体)
全是抽象方法也可以
抽象类里面允许有(各种权限的)属性
抽象类单继承 extends 1
*/
abstract class Base
{
public $name='base';
protected $age=12;
private $sex = '男';
abstract function foo();
abstract function exp();
function index()
{
echo 'this is a abstract class<br>';
}
}
abstract class Ext extends Base
{
public function foo()
{
echo '实现抽象类的foo方法,不然new不了';
}
/*public function exp()
{
echo '实现抽象类的exp方法,不然new不了';
}*/
}
class App extends Ext
{
public function exp()
{
echo '实现抽象类的exp方法,不然new不了';
}
}
总结:
1) 抽象方法 abstract function FUNC_NAME();
2) 接口的方法不允许用修饰词(系统指定死为 abstract public) 属性必须用const
定义 | 继承 | 方法 | 属性 | |
抽象类 | abstract class CLASS_NAME | extends 1 | 至少一个抽象方法 | 属性可以是各种权限 |
接口 | interface IF_NAME | implements N | 全部抽象方法,不允许修饰词 | 属性只能是静态常量 const |
实现 抽象类/接口 部分方法的class是抽象class
理解:
抽象类 定义好的封装类 给用户一些可扩展的自由,用户自由实现自己的方法
接口 严格的结构限制