2011-03-14 66 views
1

我试图动态构建这样的调用。唯一的变化部分是Some动态构建此PHP调用

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

所以它可能是

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

我想这一点,但不知道为什么如果你正在使用PHP它不工作

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

回答

3

> = 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); 
+0

伟大的思想,呃? :) +1 – alex 2011-03-14 05:32:27

1

如果你有> = PHP 5.3 ...

$class = 'Some' . 'Query'; 

$query = $class::create(); 

$query->findPk($id); 
1

尝试用:

$tablename = $dynamic."Query::create"; 

如果它不起作用,使用call_user_funcarray($dynamic."Query", "create")

祝你好运!使用

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; 
    } 

请确保您的查询类型的对象实现相同的接口。否则你可能会得到错误。