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

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?
 
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"
}
 
1. Я имел изначально ввиду 5 пхп.
2. Вся соль в том что function __construct() должно получать аргументы в обычном порядке, а не как массив аргументов.
 
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
а вариант с кучей аргументов не подошёл? имхо такой хак всё таки лучше передачи массива
 
Хак конечно неплох, но собственно мне требовалось это для реализации адаптеров, где при его создании будут передаваться параметры. А там параметры могут быть настолько разными что не упомнить какой в каком порядке идет, да и код нужно везде перелопачивать в случае изменений. Поэтому пошел по пути аргументов. Просто, вполне надежно и удобно.
 
хммммм..............
а разве адаптеры не пишутся под конкретные известные интерфейсы?
 
интерфейс одинаков, инициализация разная. скажем один работает с файлами, а другой с базой.
 
Сверху