将可变数量的变量传递给PHP中的类

时间:2010-04-25 07:00:25

标签: php variables

我需要传递可变数量的字符串来实例化不同的类。我总是可以切换数组的大小:

switch(count($a)) {
case 1:
    new Class(${$a[0]});
    break;
case 2:
    new Class(${$a[0]}, ${$a[1]});
    break;
etc...

必须有更好的方法来做到这一点。如果我有一个字符串数组(“variable1”,“variable2”,“variable3”,...),如何在不手动考虑所有可能性的情况下实例化一个类?

7 个答案:

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