PHP:如何返回一个实例化的类对象,给定一个类名?
问题描述:
他们说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;
}
}
答
return new $sModelName();
您可以通过动态的名称,以及调用函数:
$func = "foobar";
$func("baz"); //foobar("baz")
答
没错,Kenaniah打我给它。得到更快的类型...
更多的信息在这里:http://php.net/manual/en/language.oop5.php,请参阅the first user note。
答
尝试:
$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;
}
}
}
答
我知道这是一个2岁多的问题,但我只是想指出,你都错过了这里的问题!你所有的功能不要返回一个实例化的类,但一个新的类。这包括提问者发布的初始功能!
如果你想返回实例化类,你必须保持跟踪你的类和它们的属性的数组,并从那里返回他们当你需要的类的实例,而不是重新初始化类。
如果您的类在构建时进行了大量处理,此方法还可节省大量处理时间。获取实例比创建新类更好,除非您确实希望重新初始化类属性。请注意!
请注意:在返回对象之前,您不必将对象存储在变量中。无论哪种方式,它在功能上都是等同的。 – Kenaniah 2009-12-08 01:18:11