2013-10-15 75 views
1

我有4類: Main SQL Template Member 。我想SQL TemplateMember延長Main類。 但同時,我希望能夠不能同時調用所有的類都不需要它們。PHP多類延伸出的一個

因此,在我的index.php文件中,我會撥打MainTemplate
在我的register.php頁面,我會打電話Main,Template, SQLMember
在我的submit.php頁面中,我會打電話MainSQLMember

我有類是這樣的:

------ Main Class ------

<?php 

public $db; 

class Main { 

    public function __construct(){ 
    } 
    public function One(){ 
     // here I would call Two, Three, and Four if available 
    } 
} 


------ SQL Class ------

<?php 
class SQL extends Main { 
    public function __construct(){ 
     parent::__construct(); 
     $this->db = new mysqli(....); 
    } 
    public function Two(){ 
     $this->db->query(.....); 
     // Fetch query code 
     echo $result; 
    } 
} 


------ Template Class ------

<?php 
class SQL extends Main { 
    public function __construct(){ 
     parent::__construct(); 
     $this->db = new mysqli(....); 
    } 
    public function Three(){ 
     $this->db->query(.....); 
     // Fetch query code 
     echo $result; 
    } 
} 


Member類將是等同於其他的和具備的功能4 ..

所以,這就是我正在做,但我無法從子類調用函數,只從主要。

你能告訴我一個更好的方法嗎? 預先感謝您。

+0

閱讀http://php.net/manual/en/language.oop5.autoload.php –

回答

3

如果你真的需要在Main類的方法twothreefour沒有實現它們你就必須使它抽象,迫使孩子的落實他們的所有(這是絕對可以接受的好方法做這樣的事情)。

<?php 

abstract class Main { 

    function fn1() { 
    $this->fn2(); 
    $this->fn3(); 
    } 

    abstract function fn2(); 

    abstract function fn3(); 

} 

class Child extends Main { 

    function fn2() { 
    return "foo"; 
    } 

    function fn3() { 
    return "bar"; 
    } 

} 

?> 

另一種選擇是檢查方法是否存在(不好/ hack /請參閱下面的註釋)。

<?php 

class Main { 

    function fn1() { 
    if (method_exists($this, "fn2")) { 
     $this->fn2(); 
    } 
    if (method_exists($this, "fn3")) { 
     $this->fn3(); 
    } 
    } 

    function fnDontRepeatYourself() { 
    foreach (range(2,3) as $fn) { 
     if (method_exists($this, $fn)) { 
     $this->{$fn}(); 
     } 
    } 
    } 

} 

?> 

第二種方法的問題是,孩子們實際上並不知道他們必須實施方法,這是有問題的。

繼承應該從一般到具體,你不應該在你的類中有echo什麼,而應該是return。我現在可以告訴你很多事情,關於該做什麼和不做什麼,但是我認爲在繼續之前,最好先學習更多關於面向對象的理論。 :)

+0

因此,我應該在主要類中有所需的所有類功能,而其他類中的其他類功能,對吧? - 我實際上沒有回顯,我只是返回它,並且只在最終的PHP文件中回顯一次。我只是在這個例子中做到了。感謝您的幫助 – user2271353

+0

我將答案擴展爲包含一個示例子類。這很好,總是嘗試在你的類中編寫沒有副作用(例如'echo','head()')。你需要某種入口點來回應你的輸出,當然完全可以和必要的。我希望我的榜樣對你有所幫助,否則不斷問。 ;) – Fleshgrinder

+0

我有問題,宣佈類抽象。您是否可以在Skype上添加我,並嘗試通過TeamViewer查看問題?如果是這樣,我的Skype是xG.WilliamSantos – user2271353

1

在你的Main類中實現Two(),Three()和Four()。他們不一定要做任何事情。然後您可以在Main中調用它們 - 它們將執行在調用One()的類上的重寫函數中實現的內容。

+0

你能指定如何實現它們(舉一個例子)? - 我是新來的班級。 – user2271353

+0

在您的Main類中,定義名爲Two,Three和Four的方法,但沒有實現。例如。公共函數MethodName(){} –

+0

好的,但我需要從他們被覆蓋的類中調用它們,對吧?當我從Main類調用函數'One'時,我希望它們被調用。 – user2271353

1

不要讓這些類繼承主類。 SQL,模板和成員沒有很多共同之處。因爲他們不應該擴大一個共同的類別Main,他們應該是自己的。普通的大師班會在以後變得更加複雜。

存在多個類需要數據庫訪問的情況。這是組成時發揮作用。 Member類應該能夠讀寫數據庫 - 您應該創建一個SQL對象並將其傳遞給Member對象。如果模板也存儲在數據庫中,則同樣適用於Template類。

我的問題在於:我不能進入好的面向對象編程的全部內容,因爲這樣會填充書本,並且不會很適合Stackoverflow上的問題和答案格式。所以我只能建議你應該閱讀更多關於主題的內容,並避免使用God object pattern

+0

謝謝你的回答。我如何「創建一個SQL對象並將其傳遞給'Member'對象? – user2271353

+0

'$ sql = new SQL; $ member = new Member($ sql);' - sql對象將被存儲在內部,然後可以被需要數據庫的成員的任何方法使用。 – Sven