繁体   English   中英

PHP:如何在给定类名的情况下返回实例化的类对象?

[英]PHP: How to return an instantiated class object, given a class name?

他们说eval()是邪恶的 我想避免使用适当的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;
  }
}

return new $sModelName();

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

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

是的,Kenaniah击败了我。 打字速度更快...

此处的更多信息: http : //php.net/manual/en/language.oop5.php ,请参阅第一个用户说明

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

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

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

尝试:

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM