2011-03-28 47 views
1

我有一個生成單例類的類。 (注意,這是爲這個問題的目的過於簡化的代碼,例如,它不檢查的文件路徑存在)使用參數在單件工廠中實例化類

class Singleton 
{ 
    public function Load($classname, $params) 
    { 
     $filepath = 'classes/'.$classname.'.php'; 
     require_once($filepath); 
     return $classname(); 
    } 

} 

現在說,我想傳遞的可改變參數的數組大小與正在創建的類的構造函數相同。做這個的最好方式是什麼?我設想了一些沿着call_user_func_array但是對於類的東西?

+1

你使用Singleton而不僅僅是一個靜態方法的任何原因? – Jacob 2011-03-28 04:16:33

+2

您可能想了解一下[PHP的自動加載功能](http://us2.php.net/manual/en/function.spl-autoload-register.php),它複製了您在此嘗試執行的操作。 – Charles 2011-03-28 04:23:06

+0

@jacob,因爲傳遞給類的參數可能會根據具體情況而變化。例如,一個被加載的類是一個MySqlConnection類,它具有傳遞給構造函數的連接細節。 – Chris 2011-03-28 04:47:33

回答

2

可以實現與使用PHP's Reflection library一些有趣的結果。

function Load($class, $args) 
{ 
    $reflection = new ReflectionClass($class); 
    $object = $reflection->newInstanceArgs($args); 
    return $object; 
} 

這是簡化的,意味着使用__autoload功能,也不會檢查名稱空間,如果你使用它們,再加上每次調用它的時候,它會創建一個類的新實例,所以你需要實現一組對象來跟蹤你已經創建了哪些對象,等等......

而對於基本文檔:$class是一個字符串,其中包含您希望實例化的類的名稱,以及$args是一個參數數組,您將傳遞給__construct()方法。

+0

工作起來就像魅力!! – Chris 2011-03-28 04:56:06

+0

優秀!樂意效勞。 – 2011-03-29 14:19:56

0

未經測試,但爲何不將它們加載到構造函數中?即返回$classname($params);與您的構造函數設置爲__construct($params = false).然後,您可以檢查是否通過參數,使您的構造函數參數可選...

這確實意味着所有類需要具有相同的構造函數。

class Foo { 

     public function __construct($params = false) { 
      if($params === false) 
       echo 'not passed'; 
      else 
       print_r($params); 
     } 
    } 

$class = 'Foo'; 
$foo = new $class(array('one', 'two')); 
$foo2 = new $class(); 

輸出: 陣列([0] => [1] => 2) 沒有通過

+0

謝謝Jorg。我的確初步考慮過這個問題,但是想知道是否有更好的方法來實現它。 – Chris 2011-03-28 04:24:06

+0

對不起,不能真正想到除此之外的任何東西,會話變量,或者設置另一個包含所有變量的類......但是這些解決方案對我來說聽起來並不更優雅:p – Jorg 2011-03-28 04:40:11