是否有另一种方法来创建具有方法返回的类名的对象?

时间:2011-11-08 10:32:13

标签: php

我有这个方法:

public function getInstance()
{
    $classname = $this->getFullyQualifiedClassName();
    return new $classname();
}

有没有办法在没有$classname变量的情况下编写此变量,该变量仅使用一次?

2 个答案:

答案 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());
}