2016-11-30 5 views
0

Ich möchte alle anderen Methoden in der Klasse außer Methoden, die durch Schnittstelle implementiert.Verbieten alle Methoden außer Interface-Methode

Für Probe:


    interface Helper_Interface_AdminSinglePage { 

    public function action_index(); 

    /** 
    * AJAX save 
    * @return mixed 
    */ 
    public function action_save(); 

    /** 
    * AJAX delete 
    * @return mixed 
    */ 
    public function action_delete(); 
} 

Haben Sie eine Idee haben oder vielleicht sogar Lösung? Ich kann es selbst herausfinden, brauche nur ein paar Vorschläge.

+0

Aber warum brauchen Sie auch das zu tun? – Federkun

+1

Es gibt keine besonders gute Möglichkeit, dies zu tun - Sie müssten Reflektion verwenden, um Klassen zur Laufzeit zu analysieren und Ausnahmen auszulösen, wenn "nicht autorisierte" Methoden existieren. Warum musst du? Als Schnittstellenautor sollte es Ihnen egal sein, * wie * die Methoden implementiert sind oder welche anderen Schnittstellen von derselben Klasse implementiert sind. Das ist wirklich der Punkt. Wenn Sie eine konkretere Implementierung erzwingen möchten, sollten Sie die Klasse selbst bereitstellen. – iainn

+0

Ich habe eine strenge Architektur, und ich würde gerne sehen, dass Junioren diesen Weg ohne unerwartetes Verhalten verfolgen. –

Antwort

1

Sie wollen keine Schnittstelle. Sie möchten eine Klasse final mit dieser API, in der der Client das Verhalten als Rückruf übergeben, den Ihre Klasse aufrufen kann. Etwas wie:

final class AdminSinglePage 
{ 
    private $index; 
    private $save; 
    private $delete; 

    public function __construct(Closure $index, Closure $save, Closure $delete) 
    { 
     $this->index = $index; 
     $this->save = $save; 
     $this->delete = $delete; 
    } 

    public function action_index() 
    { 
     call_user_func_array($this->save, []); 
    } 

    public function action_save() 
    { 
     call_user_func_array($this->save, []); 
    } 

    public function action_delete() 
    { 
     call_user_func_array($this->delete, []); 
    } 
} 

, die wie folgt sein instanziieren:

$page = new AdminSinglePage(function() { 
    echo 'index page'; 
}, function() { 
    echo 'save page'; 
}, function() { 
    echo 'delete page'; 
}); 

// use it 
$page->action_save();