2017-10-30 10 views
0

MyInterface.phpMyTrait.phpに同じメソッドprintData()を作成しました。MyInterface.phpを実装し、MyTrait.phpを使用するコントローラからメソッドprintData()を呼び出しています。しかし、この方法は常にMyInterface.phpから呼び出しています。これがなぜ起こるのか説明してください。同じ名前のメソッドは、TraitからではなくInterfaceから呼び出されますか?

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

メートルエドはMyInterfaceからではなく、HomeControllerから呼び出しています。

HomeControllerは、形質MyTraitからメソッドを取得してからオーバーライドするためです。

あなたの特性にそのメソッドを追加したい場合は、インターフェイスを宣言する必要はありません。

これらのメソッドを宣言するために、それを実装するクラスを強制されませんが、あなたが

関連する問題