2015-02-11 50 views
1

我不知道如果我的PHP解釋器不能正常工作,或者如果我理解特質錯誤。這是我的代碼片段:爲什麼特質不會覆蓋類中的方法?

<?php 

trait ExampleTrait{ 
    public function foo() 
    { 
     echo 'y'; 
    } 
} 

class ExampleClass 
{ 
    use ExampleTrait; 

    public function foo() 
    { 
     echo 'x'; 
    } 
} 

$exCl = new ExampleClass(); 

$exCl->foo(); 

我認爲這應該顯示「y」,但它顯示「x」,而不是。爲什麼?

+3

從php手冊:基類的繼承成員被特性插入的成員重寫。優先順序是來自當前類的成員重寫Trait方法,它繼而覆蓋繼承的方法。 – 2015-02-11 12:07:52

+0

@Debflav好吧,不像擴展類,因爲擴展一個類時,子類將覆蓋父類的方法(如果有的話)。當在類中插入特質時,類中的方法優先於特性。 – 2015-02-11 12:11:19

+0

@AndreiP。,謝謝,我想我只是沒有在手冊 – drakonli 2015-02-11 12:41:18

回答

3

仔細閱讀Trait documentation我建議嘗試每個示例並進行自己的修改以確保您理解它。還有就是我的例子,希望它有助於:

<?php 
class A { 
    public function foo() { 
     echo "x"; 
    } 
} 

class B extends A {} 

$test = new B(); 
$test->foo(); 

// result X 

這是很清楚的,我認爲,現在允許使用特點:

<?php 
class A { 
    public function foo() { 
     echo "x"; 
    } 
} 

trait T { 
    public function foo() { 
     echo "y"; 
    } 
} 

class B extends A { 
    use T; 
} 

$test = new B(); 
$test->foo(); 

// result y 

正如你所看到的特質方法覆蓋基類的方法。現在讓在B類

<?php 
class A { 
    public function foo() { 
     echo "x"; 
    } 
} 

trait T { 
    public function foo() { 
     echo "y"; 
    } 
} 

class B extends A { 
    use T; 
    public function foo() { 
     echo "z"; 
    } 
} 

$test = new B(); 
$test->foo(); 

// result z 

的繼承從基類構件通過由特質插入的構件覆蓋創建FOO方法。優先順序是來自當前類的成員重寫Trait方法,它繼而覆蓋繼承的方法。

+0

中發現那是的,但是如果Trait在方法'foo'中使用了一個'bar'方法,並且A類使用了特徵T並且它覆蓋了特徵方法'bar'與它自己的實現。所有好的,但是然後B擴展A並且它自己實現'bar',然後調用'B-> foo()'將使用類'A'的覆蓋方法'bar()'而不是'B '。這很糟糕:-( – 2017-07-18 14:32:21

相關問題