2017-01-17 4 views
1
trait World { 

    public function sayHello() 
    { 
     echo "World!"; 
    } 
} 

abstract class AbstractHello{} 

class Hello extends AbstractHello { 
    use World; 

    public function sayHello() 
    { 
     echo "Hello"; 
     $this->sayHello(); // calling its not working 
    } 
} 

class Hello2 extends AbstractHello { 
    use World; 
} 

Теперь, если я позвоню следующим образом, он должен показать «HelloWorld!».Как вызвать метод признаков из метода класса, который использует эту черту, если оба имени метода одинаковы?

$h = new Hello(); 
$h->sayHello(); 

И если вы звоните следующим образом, он должен показывать «Мир!».

$h = new Hello2(); 
$h->sayHello(); 

Я не хочу, чтобы изменить имя методы черты, используя в качестве оператора, так как метод SayHello() был вызван из других мест для класса ребенка, как hello2.

Выше кода не работает. Любая помощь?

ответ

2

В вашем классе Hello вам нужно создать псевдоним для sayHello() метод признака.

class Hello extends AbstractHello { 
    use World 
    { 
     sayHello as sayHelloWorld; 
    } 

    public function sayHello() 
    { 
     echo "Hello"; 
     $this->sayHelloWorld(); // calling it's working now 
    } 
} 
+0

Thanks @ marian0. Он работал нормально. –