Intereting Posts
Не удалось запустить тест PHPUnit в PHPStorm Согласование целевой команды обработки « » недопустимо Отказованная почта Обработка в PHP – Какие-нибудь современные решения? пустая страница с большими циклами Как разрешить исключение ServiceCircularReferenceException? Как загружать ресурсы сайта независимо от пути родительского файла Codeigniter: контроль прав доступа с наследованием PHP RegEx: обнаружение уязвимости в шаблоне проверки электронной почты Есть ли какая-либо инъекционная уязвимость в теле письма? как сделать прикрепленное файл или изображение как SO на форме Powershell downloadFile со специальными символами Текстовое URL-адрес регулярного выражения PHP для HTML-ссылки PHP: как избежать повторного использования функций? модель существует или нет в YII с использованием настраиваемой функции – Производительность file_get_html отображает Fatal Error Call для неопределенной функции

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

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

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 new Example($array); class Example { public function __construct() { foreach (func_get_args() as $arg) { // do stuff } } } 
 // 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); 

Edit: если вы хотите использовать эту функцию с вашим $ a = array ("variable1", "variable2", 'variable3 ", …)

 call_user_func_array('make', array_merge(array('MyClass'), $a)); 

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

 <?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 и __set для легкого сохранения информации.

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

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

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

 class Factory { public static function CreateInstance($args) { switch(func_get_num_args()) { case …: return new ClassA(…); break; case …: return new ClassB(…); break; } } }