动态构建这个php调用

时间:2011-03-14 05:27:11

标签: php oop

我正在尝试动态构建这样的调用。唯一改变的部分是Some

SomeQuery::create->findPk($id);

所以它可能是

WhatQuery::create->findPk($id);
OtherQuery::create->findPk($id);

我试过这个,但不确定为什么它不起作用

$dynamic = "Some";
$tablename = $dynamic."Query::create()";
$$tablename->findPk($id);

4 个答案:

答案 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_funcarray($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类型对象实现相同的接口。否则你会收到错误。