2010-10-13 116 views
5

想知道如果这甚至可能或PHP的限制,谷歌搜索似乎是这样的,但也许我错过了一个聪明的解决方案在这里。Codeigniter和多继承?

希望这会有道理。现在我有两个部分到我的网站,管理员和客户端。我已经能够将它分成两个控制器(管理员和客户端),它们从基础MY_Controller类继承,但是我遇到的问题是实现我的身份验证控制器。

客户端/管理员登录之间有很多共享代码,现在我必须为每个管理员和客户端创建一个授权控制器,以扩展基础(这意味着需要重复代码),或者只需扩展MY_Controller类并在每个函数中使用if/thens,然后就会变得混乱(并绕过管理/客户端父类,这会破坏使它们的目的...)。

我想知道是否有一种方法可以使Auth控制器为“中性”(?),并且能够从管理员/客户端控制器继承,因此如果X是基本控制器,并且Y是Auth ...

X -> Admin Controller -> Y 
X -> Client Controller -> Y 

我正在使用一个认证库封装一些较低级别的功能,宁可不要粘贴布局逻辑和那样的东西在那里。如果这是一个愚蠢的问题,请原谅我。谢谢!

+0

,如果你发现了另一个答案,然后重命名这个话题[关闭]或标记一个答案,你的答案 – ITroubs 2010-10-13 17:49:58

回答

3

多重继承是不可能的。要么你可以使用接口,也可以使用访问者designpattern这样的:

<?php 

class A { 
    public $avar = 'I\'m A'; 
    function accept(Visitor $v){ 
     $v->visitA($this); 
    } 
} 

class B { 
    public $bvar = 'B reporting'; 
    function accept(Visitor $v){ 
     $v->visitB($this); 
    } 
} 


class Visitor { 
    function visitA(A $a){ 
     echo $a->avar; 
    } 

    function visitB(B $b){ 
     echo $b->bvar; 
    } 
} 


$A = new A(); 
$B = new B(); 
$visitor = new Visitor(); 

$A->accept($visitor); 
$B->accept($visitor); 

?> 

不幸的是PHP还没有准备好为在java中一样通过它们的参数区分方法调用,其中这个例子看起来像:

class A { 
    public String avar = 'I\'m A'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 

class B { 
    public String bvar = 'B reporting'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 


class Visitor { 
    function visit(A a){ 
     System.out.println(a.avar); 
    } 

    function visit(B b){ 
     System.out.println(b.bvar); 
    } 
} 


A = new A(); 
B = new B(); 
visitor = new Visitor(); 

A.accept(visitor); 
B.accept(visitor); 

,你必须通过它们的参数的类型来区分多个访问方法

+0

所以在这里你可以做一些像Admincontroller-> accept($ visitor)的东西,在访问者中你有两种方法,一种叫做visitAdmin,另一种叫做visitUser,当你不知道需要访问的控制器的类型时这是没有问题的,因为你给控制器的访问者,他决定哪个访问者的方法调用 – ITroubs 2010-10-13 08:11:37

+0

你也应该实现一个只有接受方法的小访问者接口,并让两个控制器实现该接口,以便您可以在您的方法中使用typehinting在那里你给你的控制器,以便你可以确保他们有接受方法 – ITroubs 2010-10-13 08:13:11

+0

试图玩弄这种方法! – Jeff 2010-10-14 06:50:14

0

使用PHP无法实现多继承。我想知道,为什么你需要两个单独的登录控制器?你能解释你在控制器中做什么吗?

编辑:
不知道您的代码是否允许这样做,但您可以尝试将所有常规部件放在客户端控制器中,并让管理控制器从此扩展。

X -> Admin Ctrlr -> Client Ctrlr -> Y 
X -> Client Ctrlr -> Y 
+0

嗯,我有登录/ REGIST单独的逻辑呃取决于用户是否在网站的管理员或客户端部分。例如,如果用户在管理部分注册,我会处理更多的表单域,或者要求邀请代码等。还有一些相同的登录信息,例如忘记密码,重置等。 – Jeff 2010-10-13 07:37:44