Передайте переменное количество переменных к классу в PHP

Я должен передать переменное количество строк для инстанцирования различных классов. Я могу всегда делать переключатель на размере массива:

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

Должен быть лучший способ сделать это. Если у меня есть массив строк ("variable1", "variable2", 'variable3"...), как я могу инстанцировать Класса, вручную не объясняя каждую возможность?

10
задан kennytm 25 April 2010 в 07:01
поделиться

7 ответов

Если вам нужно сделать это таким образом, вы можете попробовать:

$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());
    }
}
3
ответ дан 4 December 2019 в 04:20
поделиться

Вы можете использовать массив для передачи номера переменной переменной в класс, например:

<?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);

 ?>

Output

some value here 1
some value here 2
some value here 3

Вы также можете использовать __ get и __set магические методы для легкого сохранения информации.

0
ответ дан 4 December 2019 в 04:20
поделиться

Посмотрите здесь . Способ 2 помогает? Кроме того, возможно, переместив переключатель в конструктор (, если это практично), вы сможете скрыть это от остальной части кода.

-1
ответ дан 4 December 2019 в 04:20
поделиться
// 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 = ("переменная1", "переменная2", 'переменная3 ", ...)

call_user_func_array('make', array_merge(array('MyClass'), $a));
1
ответ дан 4 December 2019 в 04:20
поделиться
<?php

new Example($array);

class Example
{
    public function __construct()
    {
        foreach (func_get_args() as $arg)
        {
            // do stuff
        }
    }
}
1
ответ дан 4 December 2019 в 04:20
поделиться
​​

взгляните на шаблон проектирования фабрики:

class Factory {
  public static function CreateInstance($args) {
    switch(func_get_num_args()) {
      case …:
        return new ClassA(…); break;
      case …:
        return new ClassB(…); break;
    }
  }
}
-1
ответ дан 4 December 2019 в 04:20
поделиться

Кажется, отражение может вытащить это из шляпы за вас. Это любезно предоставлено примечаниями PHP 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 = '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');

?>
0
ответ дан 4 December 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: