我正在尝试动态构建这样的调用。唯一改变的部分是Some
SomeQuery::create->findPk($id);
所以它可能是
WhatQuery::create->findPk($id);
OtherQuery::create->findPk($id);
我试过这个,但不确定为什么它不起作用
$dynamic = "Some";
$tablename = $dynamic."Query::create()";
$$tablename->findPk($id);
答案 0 :(得分:3)
如果您使用的是PHP> = 5.3,则可以使用以下内容:
$className = 'SomeQuery'; // or another one
$className::create()->findPk($id);
作为参考,请参阅手册的此页面:Scope Resolution Operator
但这对PHP<无效; 5.3。
使用PHP 5.2,您将不得不回退到基于call_user_func()
的解决方案 - 或其家庭的其他功能。
我认为这样的事情可以解决问题:
$className = 'SomeQuery'; // or another one
$created = call_user_func(array($className, 'create'));
$created->findPk($id);
答案 1 :(得分:1)
如果您有> = PHP 5.3 ...
$class = 'Some' . 'Query';
$query = $class::create();
$query->findPk($id);
答案 2 :(得分:1)
尝试:
$tablename = $dynamic."Query::create";
如果不起作用,请将call_user_func与array($dynamic."Query", "create")
一起使用。
答案 3 :(得分:1)
要使用的工厂模式:
class QueryCreator {
public static function create($queryTypeName) {
if(class_exists($queryTypeName)) {
return $queryTypeName::create();// to use your model.
// I'd use return new $queryTypeName();
}else {
throw Exception("class ".$queryTypeName." does not exist");
}
}
}
用法:
try {
$query = QueryCreator::create("myQuery");
$query->findPK($id);
} catch (Exception $e) {
// whatever// throw it forward or whatever you want to do with it;
}
确保您的Query类型对象实现相同的接口。否则你会收到错误。