2013-07-24 23 views
0

我有一個類基礎,它具有一個稱爲加載的屬性,它是類加載的對象。加載類有一個名爲view的函數,其中包含頁面。現在我需要撥打電話:將PHP對象實例更改爲父類

這與CodeIgniter的$ this-> load-> view(「test.php」)類似。

裝入類

class Load { 
    public function view($page){ 
     //this function loads views to display 
     include($page); 
    } 
    public function model($class){ 
     //loads model classes 
    } 
    public function library($class){ 
     //loads libraries 
    } 
} 

基類

class Base { 
    function __construct(){ 
     $this->load = new Load(); 
    } 
} 

索引頁

$base = new Base(); 
$base->load->view("test1.php"); 

this1.php

echo "testing1\n"; 

$this->load->view("test2.php"); 

test2.php

echo "testing2"; 

輸出應該

testing1 
testing2 
+0

讓您的視圖功能的公共'公共功能視圖($頁){' – zzlalani

+0

一個更好的面向對象的方法是具有基類中的包裝方法... –

+3

請在這個問題上付出一些努力。您沒有解釋過您的問題,因爲您的代碼段忽略了上下文,因此很難弄清楚。 –

回答

1

你真正想要的我認爲是遵循工廠模式。 (至少,這就是你的意思,如果你想$view變量實際包含Load類的實例)

使構造器受到保護,以便唯一的類可以創建新的實例,然後在基類中添加一個靜態方法,例如'factory'返回所需類的實例。

那麼你的代碼看起來像

$view=Base::factory(); 
$view->view("test1.php"); 
0

注意:這個答案是對的任何編輯之前進行這個問題。請據此評價

你必須標記爲public的功能,讓他們從定義類的外部調用(這是簡化當然)

嘗試以下操作:

class Load{ 
    public function view($page){ 
     include($page); 
    } 
} 

class Base{ 
    public $load; 
    function __construct(){ 
     $this->load = new Load(); 
    } 
} 

(大寫的類名是我自己的首選)

這應該可以工作,但從乾淨的OOP角度來看這不是一個好設計,因爲Base類的用戶需要知道Load類作品。這被稱爲「緊密耦合」,應儘可能地避免。

我建議考慮以下選擇:

class Load{ 
    public function view($page){ 
     include($page); 
    } 
} 

class Base{ 
    private $load; //note the private modifier 
    function __construct(){ 
     $this->load = new Load(); 
    } 

    public function view($page){ 
     $this->load->view($page); 
    } 
} 

這樣,我只需要知道Base有一個方法view($page)和我不必知道了什麼Load做的。

如果將來要改變負載類,你可以做到這一點的引擎蓋下沒有Base用戶曾經注意到它,如果你這樣做是正確的:

假設你定義一個類:

class BetterLoad { 
    private function foo(){ 
     //do something awesome 
    } 

    private function advancedView($page){ 
     include($page); 
     $this->foo(); 
    } 
} 

並且您想將其納入Base而不是舊的Load。

class Base{ 
    private $adv_load; //note the private modifier 
    function __construct(){ 
     $this->adv_load = new BetterLoad(); 
    } 

    public function view($page){ 
     $this->adv_load->advancedView($page); 
    } 
} 

就是這樣。您不需要更改代碼中的其他任何內容。只要繼續使用舊的$base_obj->view($page),你就可以走了,甚至沒有注意到變化。

相關問題