我需要传递可变数量的字符串来实例化不同的类。我总是可以切换数组的大小:
switch(count($a)) {
case 1:
new Class(${$a[0]});
break;
case 2:
new Class(${$a[0]}, ${$a[1]});
break;
etc...
必须有更好的方法来做到这一点。如果我有一个字符串数组(“variable1”,“variable2”,“variable3”,...),如何在不手动考虑所有可能性的情况下实例化一个类?
答案 0 :(得分:3)
如果你必须这样做,你可以尝试:
$variable1 = 1;
$variable2 = 2;
$variable3 = 3;
$variable4 = 4;
$varNames = array('variable1', 'variable2', 'variable3', 'variable4');
$reflection = new ReflectionClass('A');
$myObject = $reflection->newInstanceArgs(compact($varNames));
class A
{
function A()
{
print_r(func_get_args());
}
}
答案 1 :(得分:1)
<?php
new Example($array);
class Example
{
public function __construct()
{
foreach (func_get_args() as $arg)
{
// do stuff
}
}
}
答案 2 :(得分:1)
// Constructs an instance of a class with a variable number of parameters.
function make() { // Params: classname, list of constructor params
$args = func_get_args();
$classname = array_shift($args);
$reflection = new ReflectionClass($classname);
return $reflection->newInstanceArgs($args);
}
使用方法:
$MyClass = make('MyClass', $string1, $string2, $string3);
编辑:如果你想用你的$ a =数组(“variable1”,“variable2”,“variable3”,......)来使用这个函数。
call_user_func_array('make', array_merge(array('MyClass'), $a));
答案 3 :(得分:0)
您可以使用数组将可变数量的变量传递给类,例如:
<?php
class test
{
private $myarray = array();
function save($index, $value)
{
$this->myarray[$index] = $value;
}
function get($index)
{
echo $this->myarray[$index] . '<br />';
}
}
$test = new test;
$test->save('1', 'some value here 1');
$test->save('2', 'some value here 2');
$test->save('3', 'some value here 3');
$test->get(1);
$test->get(2);
$test->get(3);
?>
<强>输出强>
some value here 1
some value here 2
some value here 3
您还可以使用 __get and __set magic methods 轻松保存信息。
答案 4 :(得分:0)
似乎反射可以为你拉出这个。这是the PHP call_user_func_array notes提供给你的。以下代码将通过使用数组内容调用构造函数来创建类。
<?php
// arguments you wish to pass to constructor of new object
$args = array('a', 'b');
// class name of new object
$className = 'ClassName';
// 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');
?>
答案 5 :(得分:-1)
看here。方法2有帮助吗?此外,也许通过将开关移动到构造函数( if ,这是实用的),您可以将其隐藏在其余代码中。
答案 6 :(得分:-1)
看一下工厂设计模式:
class Factory {
public static function CreateInstance($args) {
switch(func_get_num_args()) {
case …:
return new ClassA(…); break;
case …:
return new ClassB(…); break;
}
}
}