自己定义一个接口和抽象类,并实现它,对比接口与抽象类的区别与联系,并实例演示
static
static三种用途
class Test
{
public static function demo1():string
{
return '父类'.__METHOD__;
}
public static function demo2():string
{
//self 永远和父类绑定,不能动态的识别或设置静态成员的调用者
// return self::demo1();
//static 可以识别静态成员的调用者,子类重写了demo1则调用子类的demo1
//使用static代替self 。static用在动态的执行阶段,self用在静态的编译阶段
return static::demo1();
}
}
//子类
class Sub extends Test
{
//只要是父类中的public ,protected 声明的成员,子类都可以使用
//子类中重写父类的静态方法
public static function demo1():string
{
return '子类'.__METHOD__;
}
}
//这就是静态继承上下文
//子类可以调用父类的静态成员
echo Sub::demo2();
接口
interface 声明,接口只允许声明两类成员:类常量,公共抽象方法(没有实现过程)。
接口使用必须创建一个实现类。
实现类必须将接口中声明的抽象方法全部实现。
interface iGood
{
//类常量
const DEMO='举例';
//抽象方法
public function demo1(...$test):string;
}
//实现类实现接口
class Good implements iGood
{
public function demo1(...$test):string
{
return print_r($test,true);
}
}
$good=new Good();
echo $good->demo1('你好!');
抽象类
抽象类必须通过它的子类才可以使用,子类必须将抽象类的抽象方法实现,实现类:实现了接口和抽象类的抽象方法的 工作类
abstract 声明抽象类
抽象类不一定有抽象方法,但有抽象方法的一定是抽象类。
abstract class Model
{
//抽象方法
abstract public function __construct();
}
class UserModel extends Model
{
public function __construct(){
}
}
注意:接口不是类。
抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量.
抽象类内未必有抽象方法,但接口内一定会有“抽象”方法