php中interface, abstract, trait的区别–从此熟悉trait

PHP admin 506℃ 0评论

看到一篇写得比较好的文章来描述php中interface, abstract, trait的区别:

  1. trait看上去更像是为了代码的复用而写的一个小插件,它类似于include,可以用use放在类中间,让trait里面定义的方法作为class的一部分,本身不能直接实例化。
  2. interface里面的方法都是虚拟的,需要在继承的时候对这些方法进行重定义。也就是说,方法是说明性质的,并没有实际操作,而你在继承的时候,需要实现这些方法,不然就会出错,而且不能缺失。interface经常用于架构的时候,对一个实例所拥有的属性和方法进行抽象定义。简单来讲类似一个协议,是老板下达的任务。你要继承的话,必须满足这个协议,也就是完成老板下达的任务。
  3. abstract:当abstract作用于某个类时,此类被限定为抽象类,只能用于继承,而无法实例化对象。抽象类不一定含有抽象方法,但抽象方法一定存在于抽象类中,且继承此抽象类的子类必须全部实现其抽象方法,否则,子类也要标识为抽象类。抽象方法是必须被子类继承实现的,所以不可以用private修饰符去限定abstract抽象方法,可以用public和protected去修饰。

代码如下:

<?php trait TestTrait {
 protected $var = "TestTrait_var"; 
protected $var1 = "TestTrait_var"; 
function __construct() {   }

    function a()
    {
        echo "a".PHP_EOL;
    }
}

interface MyInterface
{
    function __construct();
    function b();
}

abstract class MyAbstract
{
    protected $var2 = "MyAbstract_var";

    use TestTrait;

    function b()
    {
        echo "b".PHP_EOL;
    }
}

class MyClass extends MyAbstract implements MyInterface
{
    protected $var3 = "MyClass_var";

    //也可以在这里引用,不区分继承关系
    //use TestTrait;
    function c()
    {
        echo "c".PHP_EOL;
    }
}

$class = new MyClass();
$class->a();
$class->b();
$class->c();

运行结果:

TestTrait_var
a
b
c

转载请注明:朋克网 » php中interface, abstract, trait的区别–从此熟悉trait

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址