2009-12-08 123 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岁多的问题,但我只是想指出,你都错过了这里的问题!你所有的功能不要返回一个实例化的类,但一个新的类。这包括提问者发布的初始功能!

如果你想返回实例化类,你必须保持跟踪你的类和它们的属性的数组,并从那里返回他们当你需要的类的实例,而不是重新初始化类。

如果您的类在构建时进行了大量处理,此方法还可节省大量处理时间。获取实例比创建新类更好,除非您确实希望重新初始化类属性。请注意!

相关问题