使用一个或多个参数实例化一个新的PHP类

时间:2009-10-15 02:03:33

标签: php

我有这个获取功能:

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

它通过调用该类的构造函数并传入键来创建一个新实例。现在,我将如何制作它以便我可以在$ key中传入一个参数数组,并使其像:

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

这样它适用于一个或多个键吗?

希望这很清楚。

使用PHP 5

4 个答案:

答案 0 :(得分:7)

这是一个有趣的问题。如果它不是构造函数,你试图给出动态参数,那么通常你可以使用call_user_func_array()。但是,由于涉及new运算符,似乎没有一种优雅的方法来执行此操作。

反思似乎是我能找到的共识。以下代码段取自call_user_func_array()上的用户评论,并很好地说明了用法:

<?php

// arguments you wish to pass to constructor of new object
$args = array('a', 'b');

// class name of new object
$className = 'myCommand';

// make a reflection object
$reflectionObj = new ReflectionClass($className);

// use Reflection to create a new instance, using the $args
$command = $reflectionObj->newInstanceArgs($args);

// this is the same as: new myCommand('a', 'b');
?>

要缩短您的案例,您可以使用:

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

答案 1 :(得分:4)

使用reflection

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

答案 2 :(得分:2)

我的library解决了这个this

// 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()测试是必需的,因为如果你愚蠢地给它一个空数组,newInstanceArgs()会抱怨。

答案 3 :(得分:0)

班级的构造函数是什么样的?它接受任意数量的参数吗?接受一组键而不是键参数列表可能更好。

call_user_func_array可能会做你想做的事:

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

请注意,这会将构造函数调用两次,这可能会产生负面影响。