2009-12-08 127 views
1

他們說eval()是邪惡。我想避免使用適當的PHP5功能的eval()行。給定一個靜態類方法中的類名,如何讓它返回一個真實的對象?PHP:如何返回一個實例化的類對象,給定一個類名?

class Model { 
    public static function loadModel($sModelPath) { 
    if (!(strpos(' ' . $sModelPath, '/')>0)) { 
     $sModelPath .= '/' . $sModelPath; 
    } 
    $sModelName = str_replace('/','_',$sModelPath); 
    // P is a global var for physical path of the website 
    require_once(P . '_models/' . $sModelPath . '.php'); 
    eval("\$oObject = new $sModelName" . '();'); 
    return $oObject; 
    } 
} 

回答

12

return new $sModelName();

您可以通過動態的名稱,以及調用函數:

$func = "foobar"; 
$func("baz"); //foobar("baz") 
0

嘗試:

$m = new Model(); 
$m = $m->makeModel(); 

class Model { 
    public static function loadModel($sModelPath) { 
    if (!(strpos(' ' . $sModelPath, '/')>0)) { 
     $sModelPath .= '/' . $sModelPath; 
    } 
    $sModelName = str_replace('/','_',$sModelPath); 
    // P is a global var for physical path of the website 
    require_once(P . '_models/' . $sModelPath . '.php'); 
    function makeModel(){ 
     $model = new $sModelName; 
     return $model; 
    } 
    } 

} 
+1

請注意:在返回對象之前,您不必將對象存儲在變量中。無論哪種方式,它在功能上都是等同的。 – Kenaniah 2009-12-08 01:18:11

1

我知道這是一個2歲多的問題,但我只是想指出,你都錯過了這裏的問題!你所有的功能不要返回一個實例化的類,但一個新的類。這包括提問者發佈的初始功能!

如果你想返回實例化類,你必須保持跟蹤你的類和它們的屬性的數組,並從那裏返回他們當你需要的類的實例,而不是重新初始化類。

如果您的類在構建時進行了大量處理,此方法還可節省大量處理時間。獲取實例比創建新類更好,除非您確實希望重新初始化類屬性。請注意!

相關問題