通过工厂用字符串实例化PHP对象

通过工厂用字符串实例化PHP对象,php,reflection,propel,Php,Reflection,Propel,这类似于 我在PHP中使用propel orm5.2.17,我想在数据库中存储一个查询类的名称,比如“AuthorQuery”,然后使用它来获取一个查询对象。对于推进,可能有不同的方法来实现这一点,避免使用::create()工厂方法。这种解决方案是受欢迎的,但我更想知道这在php中是否可行(如果答案是“不是”,我不会感到非常惊讶) 问题出在这里。这将有助于: $author_class = "Author"; $author = new $author_class(); 使用new关键字,字

这类似于

我在PHP中使用propel orm5.2.17,我想在数据库中存储一个查询类的名称,比如“AuthorQuery”,然后使用它来获取一个查询对象。对于推进,可能有不同的方法来实现这一点,避免使用
::create()
工厂方法。这种解决方案是受欢迎的,但我更想知道这在php中是否可行(如果答案是“不是”,我不会感到非常惊讶)

问题出在这里。这将有助于:

$author_class = "Author";
$author = new $author_class();
使用
new
关键字,字符串将被解释为类名

但是当我尝试使用工厂构造函数时,我得到了
语法错误,意外的T\u PAAMAYIM\u NEKUDOTAYIM
(这是指
):

$author_query_class = "AuthorQuery";
$author_query = $author_query_class::create();  // syntax error at the ::
我需要额外的
$
还是什么


事实证明,这不是PHP5.3+的问题

这与这一行有关:

$author_query_class::create();
这是因为(引自《PHP大师》一书):

用于访问静态属性的双冒号运算符 PHP中的or方法在技术上称为范围解析操作符。 如果包含以下内容的代码有问题,您将经常看到 包含T_PAAMAYIM_NEKUDOTAYIM的错误消息。这只是指 对……来说,虽然一开始看起来很吓人!“帕玛伊姆 Nekudotayim在希伯来语中的意思是“两个点,两次”


您可以在PHP5.3中执行类似的操作,PHP5.4还提供了更多支持。在PHP5.2之前,您可能需要使用类似于提供的其他答案的内容,或者,吞咽一下,
eval()

的工作方式与您描述的(据我记忆所及)PHP5.3的工作方式完全相同。但是,如果仍然使用5.2,则可以使用反射

$x = new ReflectionClass($author_query_class);
$author_query = $x->getMethod('create')->invoke(null);
或者只是

$author_query = call_user_func(array($author_query_class, 'create'));

值得一提的是,这是“非常神奇的”,当您有许多这样的结构时,您将很难理解会发生什么。

请参阅更新。我不记得是5.2还是5.3。我想我的信息更有教育意义:)是的,5.2.17。我应该提到这一点,我会把它添加到问题中。这两个都起作用了,谢谢。
$author_query = call_user_func(array($author_query_class, 'create'));