php trait 簡明教程,多重繼承的實現方案

http://php.net/manual/en/language.oop5.traits.php php

自PHP5.4.0起,PHP實現了代碼複用的一個方法,稱爲traints。 oop

Traits是一種爲相似PHP的單繼承語音而準備的代碼複用機制。Trait爲了減小單繼承語句的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用方法集。Traits和類組合的語義是定義一種方法來減小複雜性,避免傳統繼承和混入類(Mixin)相關的典型問題。 this

Traits和一個類類似,但僅僅旨在用細粒度和一的方式來組合功能。Trait不能經過它自身來實例化。它爲傳統繼承增長了水平特性的組合;也就是說,應用類的成員不須要繼承。 .net

在我理解說白了就是在繼承類鏈中隔離了子類繼承父類的某些特性(就是子類「要用父類的特性的時候」,若是trait有,就優先調用trait的方法、屬性等)。 code

<?php
/**
 * Date: 2016/3/28
 * Time: 16:38
 */

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();




輸出結果: 對象

總結繼承

① 從本質上說,trait和include文件的概念差很少 開發

②trait能夠更加方便的實現代碼複用,由於咱們用繼承關係實現的沒法在父類中訪問子類的private屬性與方法,而trait就和把代碼直接寫在對象裏的效果同樣 it

③使用trait時候應該堅定避免命名衝突,尤爲是同時使用多個trait時。 io

④若是產生了命名衝突,若是二者的可見性、初始值、static與否徹底相同,則trait中的會覆蓋掉對象中的,並拋出E_STRICT錯誤,不然會拋出E_COMPILE_ERROR錯誤,終止編譯。

相關文章
相關標籤/搜索