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

时间:2012-01-26 19:15:58

标签: php reflection propel

这类似于Can PHP instantiate an object from the name of the class as a string?

我正在使用推动orm和PHP 5.2.17 ,我想在数据库中存储查询类的名称,比如“AuthorQuery”,然后用它来获取查询对象。使用推进可能有不同的方法,使用::create()工厂方法。这个解决方案是受欢迎的,但我宁愿知道这是否有可能用php(如果答案是“它不是”,我不会非常惊讶)。

这是问题所在。这将有效:

$author_class = "Author";
$author = new $author_class();

使用new关键字,字符串将被解释为类名。

但是当我尝试使用工厂构造函数时,我得到syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM(这指的是::):

$author_query_class = "AuthorQuery";
$author_query = $author_query_class::create();  // syntax error at the ::

我是否需要额外的$或其他内容?

事实证明,这不是PHP 5.3 +

的问题

3 个答案:

答案 0 :(得分:3)

使用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'));

值得一提的是,这很“神奇”,当你有很多这样的结构时,它会变得难以理解,会发生什么。

答案 1 :(得分:1)

$author_query=call_user_func("$author_query_class::create");

答案 2 :(得分:0)

这与这一行有关:

$author_query_class::create();

这是因为(正如PHP Master一书所引用的那样):

  

我们用于访问静态属性的双冒号运算符   或者PHP中的方法在技术上称为范围解析运算符。   如果某些包含::的代码出现问题,您会经常看到   包含T_PAAMAYIM_NEKUDOTAYIM的错误消息。这只是指   到::,虽然起初看起来很惊人! “Paamayim   Nekudotayim“在希伯来语中意为”两个点,两次“。

您可以在PHP 5.3中执行类似的操作,PHP 5.4的表格中有更多支持。在PHP 5.2之前,您可能必须使用其他答案,或者gulp,eval()