2015-02-11 80 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

相关问题