2010-05-30 120 views
2

我是PHP的OOP的忠實粉絲,但我覺得像定義類方法得到混亂如此之快。在C++中,我在OOP中擁有相當不錯的背景,而且我對它在那裏的處理方式很滿意,並且很好奇在php中是否有類似的方法來處理它。PHP OOP函數聲明

更具體地說,這裏是我的意思。我喜歡在C++中如何定義類頭(myclass.h),然後在實現文件(myclass.cc)中定義函數的實際細節。我發現,這可以很容易地複製使用php中的接口,但我還沒有找到一個好的解決方案如下:

我喜歡根據它們如何訪問,在不同的文件中組織我的代碼,例如,公開的方法可以在班級之外調用,而私人方法將在其他地方組織 - 這是個人偏好。

伊夫試圖在PHP定義像類方法:

private function MyPHPClass::myFunction(){ } 

當定義ISNT直接在類塊中({}),但我還沒有過任何成功這樣做。

我已經通過php.net的所有網頁,但沒有找到像這樣的東西。我假設沒有這樣的支持,但我想我會問。

謝謝

回答

2

你不能這樣做。類聲明與Java類似。

您必須將所有內容放在一個文件中,或者至少要有一些幫助類 - 它們只是您轉發或調用的靜態方法,或者將您的某些實現推遲到封裝對象。您還可以使用__call__callstatic魔術方法來減少存根的大小,但只適用於公共方法,我建議您避免使用神奇方法。 EDI2:正如RobertPitt在評論中指出的那樣,您應該考慮在幾個類之間劃分功能的替代策略。它還有一個額外的好處,它可以使你的代碼更加分離。如果你需要,你仍然可以將幾個類的功能統一在幕牆後面。

編輯:通過使用神奇的方法,我的意思是這樣的:

class MyClassHelper { 

    public function method_one(array $args) { 
     ... 
    } 

    public function method_two(array $args) { 
     ... 
    } 
} 

class MyClass { 
    /** 
    * @var MyClassHelper 
    */ 
    private $helper; 

    private static $ALLOWED_METHODS = array("method_one" => NULL, 
     "method_two" => NULL); 

    public function __call($name, $arguments) { 
     $name = strtolower($name); 
     if (array_key_exists($name, self::$ALLOWED_METHODS) { 
      $helper->$name($arguments); 
     } 
     else 
      throw new Exception(...); 
    } 
} 

我建議你避免這種情況,有很多陷阱,以這個(處理引用,沒有代碼完成)。

+0

請問您爲什麼要儘量避免magic_methods?謝謝 – RobertPitt 2010-05-30 17:41:34

+0

魔法方法比普通方法慢,所以避免它們通常是個好主意。 – Maerlyn 2010-05-30 19:12:27

+0

我同意他們比命名方法的命名要慢,但是如果這個類是一個泛型類,並且可能不需要單獨使用100-200個方法,但是當涉及到這個方法時,__get/__ set/__ call系統會更有效率,例如$輸入 - >的get-> ID( 'INT');而不是實際定義id()作爲一種方法,只是爲了從存儲中獲取它而實際使用。我明白你的觀點,但在某些情況下,它很好,值得一些。 – RobertPitt 2010-05-30 21:48:08

1

我不是一個真正的C++/C#程序員,但在PHP界面我可以給你一個檢查,看看這是否有幫助。

接口

interface IDatabase 
{ 
    public function connect($dns = ''); 
    public function disconnect($flushCache = false); //Do not use braces, Code free in interfaces 
} 

數據庫抽象基類

abstract class Database 
{ 
    //Some driver logic here to laod mysql,oracle etc 
} 

MySQL驅動

class DBDriver_MySQl extends Database implements IDatabase 
{ 
    public function connect($dns = '') 
    { 
    //Connection logic. 
    } 
    public function disconnect($flushDns) 
    { 
    //Disconnect Login 
    } 
} 

希望這是你在找什麼。

+0

問題是你沒有PHP中的多重繼承,就像你在C++中一樣。 – Artefacto 2010-05-30 17:50:24

+0

http://stackoverflow.com/questions/90982/multiple-inheritance-in-php – RobertPitt 2010-05-30 18:50:32

+0

你錯過了這一點。你的具體例子是有道理的,但沒有解決OP的一般問題。基本上,你放棄了你唯一的具體繼承機會。如果OP已經想要擴展某個類並且仍然想要分離幾個實現,那將會失敗。當然,你可以說他應該考慮其他方法,包括策略模式,因爲他要完成的是不好的練習,我同意。 – Artefacto 2010-05-30 19:13:54