我有这个方法:
public function getInstance()
{
$classname = $this->getFullyQualifiedClassName();
return new $classname();
}
有没有办法在没有$classname
变量的情况下编写此变量,该变量仅使用一次?
答案 0 :(得分:1)
您可以使用Reflection:
$reflectionClass = new ReflectionClass('SomeClassName');
$reflectionClass->newInstanceArgs(array(1, 2, 3));
但据我所知,这将比你已有的解决方案慢得多。在一个完美的世界里,你可以写下这样的东西:
return new ( $this->getFullyQualifiedClassName() )(); // THIS DOES NOT WORK!!!
但遗憾的是,PHP的语法不够灵活,因此您必须创建令您不安的丑陋变量。
我刚才意识到还有另一种(非常丑陋的)方式: eval :
return eval("return new ".$this->getFullyQualifiedClassName()."();");
我不建议你使用它,因为使用eval附带security risk。
答案 1 :(得分:1)
为getFullyQualifiedClassName
方法提供一个参数,无论是返回对象还是字符串。
public function getFullyQualifiedClassName($return_object = false) {
//............
return $return_object ? new $classname() : $classname;
}
然后
public function getInstance()
{
return $this->getFullyQualifiedClassName(true);
}
但我认为,如果您的$classname
只需要返回类名的字符串,那么这种方法并不比getInstance
方法getFullyQualifiedClassName
好。
修改强>
正如@ x3ro所说,它违反了方法名称,另一种方法是使用Help方法,但它仍然值得一试。实际上$classname
并不是那么难看。
public function getInstance()
{
return Util::NewObjectFromName($this->getFullyQualifiedClassName());
}