Вопрос по созданию обьектов.

demongloom

Новичок
Вопрос по созданию обьектов.

Каким образом (если вообще возможно) можно при создании обьекта передать неизвестное кол-во аргументов в __construct функцию?

Код для примера:
PHP:
class object {
	
	function __construct() {
		
		var_dump(func_get_args());
		
	}
	
}

function createobject() {

    // Вот тут и требуется некое решение. Типа call_user_func_array
    $obj = new object, func_get_args() ??? 

}

createobject(1,2,3); // array(3) { [0]=>  int(1) [1]=>  int(2) [2]=>  int(3) }
createobject("test"); // array(1) { [0] => string(4) "test" }
Или же надо принимать в __construct аргументы собранные в массив в createobject при помощи func_get_args() ( типа $obj = new object(func_get_args()) ) ?

Или использовать некую функцию в классе, например __init() и передавать туда аргументы через call_user_func_array?
 

faost

Новичок
Re: Вопрос по созданию обьектов.

PHP:
<?

class object
{
    
    function object() {
        
        $args = func_get_arg(0);
        
        var_dump($args);
    }
    
}

function createObject() 
{
    
    $args = func_get_args();
    $obj = new object($args);
     
}

createObject(1, 2, 3); 
createObject('text');

?>
Для PHP5 как я понимаю нужно заменить имя конструктора на __construct

Вывод:

Код:
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
array(1) {
  [0]=>
  string(4) "text"
}
 

demongloom

Новичок
1. Я имел изначально ввиду 5 пхп.
2. Вся соль в том что function __construct() должно получать аргументы в обычном порядке, а не как массив аргументов.
 

zerkms

TDD infected
Команда форума
demongloom
единственным решением этой проблемы видел лишь использование eval (а было это в WACT)

PHP:
function &call_user_constructor_array($class, $args) {

    if (count($args) == 0) {
        return new $class();
    } else {
        // Check to make sure the class exists to prevent code inject on eval
        if (class_exists($class)) {
            $code = '$obj =& new ' . $class . '($args[';
            // Applying intval to the keys prevents code inject on eval
            $code .= implode('],$args[', array_map('intval', array_keys($args)));
            $code .= ']);';
            eval($code);
            return $obj;
        } else {
            die('Class not found');
        }
    }
}
-~{}~ 31.07.06 15:49:

пришла ещё в голову дикая идея:

т.к. в пхп можно указывать лишние параметры, не описанные в функции/методе - то можно делать так:

new $classname($arg[0], $arg[1], $arg[2], $arg[3], $arg[4], $arg[5], $arg[6], $arg[7], ... )

итд до какого-то разумного значения числа аргументов ;)
естественно массив переданных данной функции аргументов дополнить до этого самого разумного числа любыми значениями чтобы не было нотисов
 

demongloom

Новичок
Да спасибо. Об евал я думал, просто не знал как бы реализовать это четко.

А вообще я конечно решил не извращаться, а передавать аргументы единым массивом.
 

zerkms

TDD infected
Команда форума
demongloom
а вариант с кучей аргументов не подошёл? имхо такой хак всё таки лучше передачи массива
 

demongloom

Новичок
Хак конечно неплох, но собственно мне требовалось это для реализации адаптеров, где при его создании будут передаваться параметры. А там параметры могут быть настолько разными что не упомнить какой в каком порядке идет, да и код нужно везде перелопачивать в случае изменений. Поэтому пошел по пути аргументов. Просто, вполне надежно и удобно.
 

zerkms

TDD infected
Команда форума
хммммм..............
а разве адаптеры не пишутся под конкретные известные интерфейсы?
 

demongloom

Новичок
интерфейс одинаков, инициализация разная. скажем один работает с файлами, а другой с базой.
 
Сверху