这类似于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 +
的问题答案 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()
。