Codeigniter:public,membre,admin

时间:2013-12-27 20:03:22

标签: php codeigniter admin extends

在这个文件中,我有类似的东西:

class MY_Controller extends CI_CONTROLLER
{
    public function __construct()
    {
        parent::__construct();
    }   
}

class MY_Membre_Controller extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }   
}

class MY_Admin_Controller extends MY_Membre_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}

然后在我的控制器/我有例子

class Member extends MY_Membre_Controller
{ 
    /* .. construc etc */

    public function loadPicture() ...

   others functions ..
}

现在我可以做一个Admin类扩展MY_Admin_Controller并且可以使用Member方法(因为管理员是其他功能的成员) 因为我无法使用Member方法执行类似的操作:

class Admin extends MY_Admin_Controller
{
    /* construct */

   /* function index() 
      { 
          $this->loadPicture
      }
  }

1 个答案:

答案 0 :(得分:0)

我不确定你为什么要首先为这些做出自己的控制器扩展。为什么不让你的成员控制器成为一个接口而不是一个类,然后让你的Admin_Controller实现该接口?您将可以访问这些方法,并且is-a关系仍将保持Admin_controller是一个Member_controller,并且您的Admin控制器也可以访问Member_Controller中定义的方法,因为它们实际上是已实现的在Admin_Controller中。在实现包含的方法时实现Member_controller的其他类,也为它们提供了与Member_controller的is-a关系。

我在这里屠宰你的代码,只是试图让这个想法得到解决,所以你需要清理它:

interface MY_Member_ControllerI extends CI_Controller{
    public function __construct();
    public function loadPicture();
}

class MY_Admin_Controller implements MY_Member_ControllerI{
    public function __construct(){
        //some contruct stuff
    }

    public function loadPicture(){
        //load the picture
    }

    public function adminMethod(){
        //some admin stuff
    }
}
class My_Member_Controller implements MY_Member_ControllerI{
    public function __construct(){
        //some contruct stuff
    }

    public function loadPicture(){
        //load the picture
    }

    public function memberMethod(){
        //some admin stuff
    }
}

所以在这一点上,Admin和Member都与MY_Member_ControllerI接口有一个is-a关系,使它们都是相同的根类型

或者,重载Admin_Controller中的方法,以便在子类调用它们时,调用Admin_controller,Parent_Controller的父类中的相应方法。

例如

class MY_Member_Controller extends MY_Controller{
    public function __contruct(){
        //construct stuff
    }
    public function doStuff($stuff){
        //do some stuff with stuff
    }
    public function loadImage(){
        //implement load image
    }
}

class MY_Admin_Controller extends MY_Member_Controller{
    public function __construct(){
        parent::__construct();
        //plus other admin stuff
    }

    public function adminOnly(){
        //admin only stuff
    }

    public function loadImage(){
        parent::loadImage();
    }
}

class Admin extends MY_Admin_Controller{
    public function __construct(){
        parent::__construct();
        //plus other admin stuff
    }

    public function adminOnly(){
        //admin only stuff
    }

    public function loadImage(){
        parent::loadImage();
    }
}

我正在考虑其他一些方法也可以做到这一点。您有什么方法可以重新考虑您的可重用架构吗?听起来你可以真正受益于其他一些继承方法,如接口和抽象类,或滥用方法重载。