2016-11-30 20 views
0

我想禁止除了由接口實現的方法之外的類中的任何其他方法。禁止接口方法以外的任何方法

對於樣本:


    interface Helper_Interface_AdminSinglePage { 

    public function action_index(); 

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

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

你有什麼想法或者甚至解決方案? 我可以自己弄清楚,只需要一些建議。

+0

但是,爲什麼你甚至需要做的是什麼? – Federkun

+1

有沒有一個特別好的方法來做到這一點 - 你需要使用反射來分析運行時的類,並且如果存在任何「未授權的」方法則會拋出異常。你爲什麼需要?作爲接口作者,你不應該關心*方法如何實現,或者實際上哪些其他接口由同一個類實現。這確實是重點。如果你想強制一個更具體的實現,你應該提供這個類本身。 – iainn

+0

我有嚴格的體系結構,我希望看到,後輩們正在按照這種方式沒有意外的行爲。 –

回答

1

你不想要一個接口。你想要一個final類與該API,其中客戶端傳遞行爲作爲您的類可以調用的回調。喜歡的東西:

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, []); 
    } 
} 

可以實例化這樣的:

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

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