2010-06-27 53 views
2

我有具有函數hi()的父類c1。類c2擴展c1,並通過方法i()包含單例訪問。在類c2中,我想使用與c1中相同的名稱創建方法,我可以在靜態作用域中調用該方法,但在此方法中,我使用單例實例和父類中相同名稱的調用方法。如何從實例範圍的父類中調用具有相同名稱的方法

class c1{ 
    function hi(){ 
    echo 'very '.$this->a; 
    } 
} 

class c2 extends c1{ 
    private static $i; 
    public static function i() { 
     return (self::$i)?self::$i:(self::$i = new self); 
    }  

    public $a='cool'; 
    function hi(){ 
    self::i()->hi(); // here I want to call hi() from c1 but in instance scope 
    } 
} 

c2::hi(); //must echo: very cool 

在真實的例子
C1是mysqli的
C2是我的自定義DB類
和喜()被提交()
我希望能夠調用DB ::提交(),所以我不需要編寫db :: i() - > commit();



編輯:PHP < 5.3

回答

2

通常調用類的父的方法的方法是使用parent::關鍵字,但是當你在實例範圍內運行這個只作品,而不是靜態的範圍。

但是,您不能將hi()作爲靜態函數和非靜態函數來運行。

class c1 
{ 
    function hi() { 
    echo 'very '.$this->a; 
    } 
} 

class c2 extends c1 
{ 
    private static $i; 

    public static function i() { 
     return (self::$i)? self::$i: (self::$i = new c2()); 
    } 

    public $a='cool'; // not static 

    function hi() { 
    parent::hi(); 
    } 

    static function do_hi() { 
    $i = self::i(); 
    $i->hi(); 
    } 
} 

c2::do_hi(); // echoes: very cool 

附加註釋:奇怪的是,PHP允許你調用實例方法,就好像它們是靜態的方法,使用::語法。在我看來,這是錯誤的,它會導致代碼混淆。你應該假裝這種用法是不可能的,只有當你聲明它們爲static時,才能靜態地調用函數。

我不認爲嘗試聰明和強制代碼做雙重職責是一個很好的做法。你也不應該太喜歡複雜且難以閱讀或修改的單行函數。程序員通常喜歡過於緊湊的代碼,但是你會發現它使代碼很難維護。項目要求不可避免地會發生變化,您最終不得不拉開您的單線寶石。

+0

我不能老是叫靜態。我必須使用從方法i()獲得的現有連接調用mysqli實例上的提交。 – codez 2010-06-27 08:21:06

+0

是的,我想過給不同的名字,但我想保持原來的。 – codez 2010-06-27 08:35:17

相關問題