我有这个获取功能:
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
答案 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)
// 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);
请注意,这会将构造函数调用两次,这可能会产生负面影响。