1. 程式人生 > >PHP中的trait,interface和abstract

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抽象方法,可以用publicprotected去修飾。