Я должен передать переменное количество строк для инстанцирования различных классов. Я могу всегда делать переключатель на размере массива:
switch(count($a)) {
case 1:
new Class(${$a[0]});
break;
case 2:
new Class(${$a[0]}, ${$a[1]});
break;
etc...
Должен быть лучший способ сделать это. Если у меня есть массив строк ("variable1", "variable2", 'variable3"...), как я могу инстанцировать Класса, вручную не объясняя каждую возможность?
Если вам нужно сделать это таким образом, вы можете попробовать:
$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());
}
}
Вы можете использовать массив для передачи номера переменной переменной в класс, например:
<?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 магические методы для легкого сохранения информации.
Посмотрите здесь . Способ 2 помогает? Кроме того, возможно, переместив переключатель в конструктор (, если это практично), вы сможете скрыть это от остальной части кода.
// 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));
<?php
new Example($array);
class Example
{
public function __construct()
{
foreach (func_get_args() as $arg)
{
// do stuff
}
}
}
взгляните на шаблон проектирования фабрики:
class Factory {
public static function CreateInstance($args) {
switch(func_get_num_args()) {
case …:
return new ClassA(…); break;
case …:
return new ClassB(…); break;
}
}
}
Кажется, отражение может вытащить это из шляпы за вас. Это любезно предоставлено примечаниями 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');
?>