PHP:给定一个类名,如何返回一个实例化的类对象?

时间:2009-12-08 01:09:20

标签: php oop class static eval

他们说eval()是 evil 。我想避免使用适当的PHP5功能使用eval()行。给定静态类方法中的类名,如何使其返回真实对象?

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;
  }
}

4 个答案:

答案 0 :(得分:12)

return new $sModelName();

您也可以通过动态名称调用函数:

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

答案 1 :(得分:3)

是的,肯尼亚打败了我。得类型更快...

此处有更多信息:http://php.net/manual/en/language.oop5.php,请参阅the first user note

答案 2 :(得分:1)

我知道这是一个2岁的问题,但我只是想指出,你们都错过了这里的问题!您的所有函数返回实例化的类,但返回 new 类。这包括提问者发布的初始功能!

如果要返回实例化类,则必须在数组中跟踪类及其属性,并在需要类的实例时从那里返回它们,而不是重新初始化的课程。

如果您的类在构造时进行大量处理,则此方法还可以节省大量处理时间。获取实例总是比创建新类更好,除非你真的想要重新初始化类属性。注意!

答案 3 :(得分: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;
    }
  }

}