2009-07-22 47 views
0

這可能是一個非常簡單的答案 - 但有些建議值得讚賞。面向對象的常見方法:接口,摘要或其他東西

我有一個小系統,我的所有對象都使用相同的load()和loadMultiple()方法。每個代碼都完全相同。非常簡單,下面的例子。

public static function load($id) { 
    // Instantiate the object 
    $object = new self($id); 
    return $object; 
} 

示例代碼以上不能在界面去很明顯,但也不能在它的抽象類去,因爲我實例化對象(在loadMultiple方法相同)。

什麼是最優雅的解決方案呢?我目前正在計劃創建一個父類,如:

class Object_Model { 
    public function load() { 
     // Code here 
    } 
    public function loadMultiple() { 
     // Code here 
    } 
} 

class Object1 extends Object_Model { 
} 

class Object2 extends Object_Model { 
} 

但是我確定必須有更好的方法。在那兒?

回答

0

我同意Ionut - 只是採用傳統的工廠方法。

<?php 
abstract class A 
{ 
    protected $id; 

    protected function __construct($id) 
    { 
    $this->id = $id; 
    } 

    final public static function factory($subclass, $id) 
    { 
    // Instantiate the object 
    if (is_subclass_of($subclass, __CLASS__)) 
    { 
     return new $subclass($id); 
    } 
    throw new Exception("$subclass is not a valid class for this factory."); 
    } 
} 

class B extends A{} 
class C extends A{} 
class D{} 

try { 
    $b = A::factory('B', 1); 
    $c = A::factory('C', 2); 
    $d = A::factory('D', 2); 
} 
catch (Exception $e) 
{ 
    echo "Oops! " . $e->getMessage(); 
} 

您也許能夠做一些與late static binding,但是這是PHP 5.3只

+0

感謝彼得。 延遲靜態綁定看起來很完美。但我認爲我們的服務器不會支持它。 我明白你和Ionut在說什麼,但是當我非常接近優雅5.3所提供的時候,它就好像倒退了一步。 – PJE 2009-07-22 17:21:56

0

由於當前的代碼使用靜態方法,我相信這將是蠻好有一個函數,有兩個參數:實例化類的名稱和ID:

function load($class, $id) { 
    return new $class($id); 
} 

這是確定使用函數實現工廠。還是有更多的邏輯,你在那裏不能在一個函數中提取?

0

如果您使用的是PHP 5.3,則確實可以使用父類和新的static關鍵字來確定具有對其調用的靜態函數的子類。

但是我認爲您最好在使用__construct方法執行所有設置任務時使用經過驗證的真new Object1($id);方法。你的代碼會更容易閱讀和維護。

加載多個示例,您可能想要將其抽象爲單獨的函數以加快此過程。

+0

對不起dcousineau - 彼得解釋LSB更好一點,所以我給他的回答 – PJE 2009-07-22 17:29:09