一直没找到一篇文章能好好讲解一下
PHP
中的trait
,interface
和abstract
的异同,今抽时间整理了一下,做一下记录。结合一段代码说明一下,以下是代码:
<?php
trait MyTrait
{
protected $var = "MyTrait_var";
protected $var1 = "MyTrait_var";
function __construct()
{
echo $this->var.PHP_EOL;
}
function a()
{
echo "a".PHP_EOL;
}
}
interface MyInterface
{
function __construct();
function b();
}
abstract class MyAbstract
{
protected $var2 = "MyAbstract_var";
use MyTrait;
function b()
{
echo "b".PHP_EOL;
}
}
class MyClass extends MyAbstract implements MyInterface
{
protected $var3 = "MyClass_var";
//也可以在这里引用,不区分继承关系
//use MyTrait;
function c()
{
echo "c".PHP_EOL;
}
}
$class = new MyClass();
$class->a();
$class->b();
$class->c();
输出结果为:
MyTrait_var
a
b
c
以上代码中,
MyAbstract
中的function b()
也可以放在MyClass
中,或者由MyAbstract
实现接口MyInterface
。
trait
看上去更像是为了代码的复用而写的一个小插件,它类似于include
,可以用use
放在类中间,让trait
里面定义的方法作为class
的一部分,本身不能直接实例化。interface
里面的方法都是虚拟的,需要在继承的时候对这些方法进行重定义。也就是说,方法是说明性质的,并没有实际操作,而你在继承的时候,需要实现这些方法,不然就会出错,而且不能缺失。interface
经常用于架构的时候,对一个实例所拥有的属性和方法进行抽象定义。简单来讲类似一个协议,是老板下达的任务。你要继承的话,必须满足这个协议,也就是完成老板下达的任务。abstract
:当abstract
作用于某个类时,此类被限定为抽象类,只能用于继承,而无法实例化对象。抽象类不一定含有抽象方法,但抽象方法一定存在于抽象类中,且继承此抽象类的子类必须全部实现其抽象方法,否则,子类也要标识为抽象类。抽象方法是必须被子类继承实现的,所以不可以用private
修饰符去限定abstract
抽象方法,可以用public
和protected
去修饰。