2009-10-15 70 views
1

我有这样的取功能:实例化一个新的PHP类与一个或多个参数

public static function fetch($class, $key) 
{ 
    try 
    { 
     $obj = new $class($key); 
    } 
    catch(Exception $e) 
    { 
     return false; 
    } 
    return $obj; 
} 

它通过调用类的构造函数和传递的关键创建一个新的实例。现在,我会怎么做,所以我可以在$关键参数数组传递,并将它喜欢:

$obj = new $class($key[0], $key[1]...); 

所以它适用于一个或多个键?

希望这已经够清楚了。

使用PHP 5

回答

7

这是一个有趣的问题。如果它不是一个构造函数,你试图给出动态参数,那么通常你可以使用call_user_func_array()。但是,由于涉及到运营商new,因此似乎没有一种优雅的方式可以做到这一点。

反思似乎是我能找到的共识。下面的代码片断是从用户的意见采取call_user_func_array(),并说明使用相当不错:

为了缩短它为你的情况,你可以使用:

$reflectionObject = new ReflectionClass($class); 
$obj = $reflectionObject->newInstanceArgs($key); 
0

该类的构造函数是什么样的?它是否接受任意数量的参数?接受一组键而不是关键参数列表可能会更好。

call_user_func_array也许可以做你想做的:

$obj = new $object_class(); 
call_user_func_array(array($obj, '__construct'), $args); 

注意,这个调用构造两次,这可能有负面影响。

+0

另外请注意这不会适用于使用类的名称作为构造函数名称而不是'__construct'的PHP4代码。 – strager 2009-10-15 02:15:59

+0

取决于类,有些是__construct($ key),有些是__construct($ key1,$ key2) – roflwaffle 2009-10-15 02:16:19

4

使用reflection

$classReflection = new ReflectionClass($class); 
$obj = $classReflection->newInstanceArgs($key); 
2

library解决了这个this:因为如果你给它一个空数组newInstanceArgs()会抱怨,愚蠢

// Returns a new instance of a `$classNameOrObj`. 
function fuNew($classNameOrObj, $constructionParams = array()) { 
    $class = new ReflectionClass($classNameOrObj); 
    if (empty($constructionParams)) { return $class->newInstance(); } 
    return $class->newInstanceArgs($constructionParams); } 

empty()测试是必需的。

相关问题