2010-10-13 164 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