2017-10-30 10 views
0

MyInterface.phpMyTrait.php에 동일한 방법 printData()을 만들었으며 MyInterface.php을 구현하고 MyTrait.php을 사용하는 컨트롤러에서 printData() 메서드를 호출하고 있습니다. 그러나이 방법은 항상 MyInterface.php에서 호출합니다. 이것이 발생하는 이유를 설명해주십시오.특성 이름이 아닌 인터페이스에서 동일한 이름의 메서드가 호출 되었습니까?

MyInterface.php

<?php namespace App\Interfaces; 

interface MyInterface 
{ 
    public function printData(); 
} 

MyTrait.php

<?php namespace App\Traits; 

trait MyTrait 
{ 
    public function printData() 
    { 
     dd("From Trait"); 
    } 
} 

HomeController.php

<?php namespace App\Http\Controllers; 

use App\Interfaces\MyInterface; 
use App\Traits\MyTrait; 
use App\User; 

class HomeController extends Controller implements MyInterface 
{ 
    use MyTrait; 

    public function index() 
    { 
     $this->printData(); 
    } 

    public function printData() { 
     // TODO: Implement printData() method. 
     dd("From Interface"); 
    } 
} 
+1

에있는 모든이에 대해 자세히 알아보십시오. 기회는 당신이 그 결과를 보시려면'Use App \ Traits \ MyTrait'을 추가해야합니다. – apokryfos

+0

@apokryfos 예, 그 질문을 업데이트하겠습니다. –

+2

클래스의 메소드는 항상 특성에서 가져온 메소드보다 우선합니다. [매뉴얼의 우선 순위 섹션 참조] (http://php.net/manual/en/language.oop5.traits.php#language.oop5.traits.precedence). – iainn

답변

5

이처럼 사용해보십시오 .. 당신은 형질의 방법을 만드는 때문에 그렇게하고 싶지 않아 어떤 인터페이스 :

class HomeController extends Controller implements MyInterface 
{ 
    use MyTrait{ 
     printData as MyTraitPrintData; 
    } 

    public function index() 
    { 
     $this->MyTraitPrintData(); 
    } 

    public function printData() 
    { 

     dd("From Interface"); 
    } 
} 

형질은 reusable 방법 및 특성을 제공하기위한 것이다. 클래스의 메서드를 재정의하지 않습니다. HomeController 안에 printData()을 정의하면 MyTrait 안에 실제로 printData()을 무시합니다. 그래서 서로를 차별화해야합니다.

이 코드가 정상적으로 작동 할 방법은 없습니다 Horizontal Reuse for PHP

1

M 개의 ethod는 MyInterface에서 전화하지 않고 HomeController에서 전화합니다.

이유는 HomeController이 특성 MyTrait에서 메서드를 가져 왔지만이 메서드를 재정의하기 때문입니다.

특성에 해당 방법을 사용하려면 인터페이스를 선언 할 필요가 없습니다.

이러한 메소드를 선언을 구현하는 클래스를 강요 할 수 있지만,