call_user_func() & __construct()

Panchous

Павел
я бы сделал через ReflectionMethod...
т.е. создал объект с пустым конструктором - потом его инициализировал (необходимыми параметрами через ReflectionMethod::invokeArgs)

твое решение тоже имеет право на жизнь
 

crocodile2u

http://vbolshov.org.ru
Panchous
Если тебя не затруднит, поясни свою мысль. Конкретно, что ты имеешь в виду под следующими словами: "создал объект с пустым конструктором"?

Объясню, как я понимаю ситуацию.
1) Создать экземпляр класса с пом. Reflection можно лишь вызвав ReflectionClass::newInstance().
2) При этом, если конструктор имеет обязательные параметры, обойтись без варнигов можно, только передав эти аргументы в ReflectionClass::newInstance().
3) Вызвать метод-конструктор с помощью invoke или invokeArgs невозможно. (Trying to invoke non static method test::__construct without an object)

Я попробовал воспроизвести то, что ты (ну, как мне показалось) хотел донести:
PHP:
class test {
	function __construct($p1, $p2)
	{
		var_dump(func_get_args());
	}
}

$reflection = & new ReflectionClass('test');

$args = array('a1', 'a2');

$instance = $reflection->newInstance();

$constructor = $reflection->getConstructor();

$instance1 = $constructor->invokeArgs($instance, $args);
Результат:

[vitek@workstation tree]$ php reflection.php

Warning: Missing argument 1 for test::__construct() in /home/vitek/php/tree/reflection.php on line 3

Warning: Missing argument 2 for test::__construct() in /home/vitek/php/tree/reflection.php on line 3
array(0) {
}
array(2) {
[0]=>
string(2) "a1"
[1]=>
string(2) "a2"
}

То есть способ работает, но с варнигами. И это как-то несуразно - два раза вызывать конструктор...
 

Panchous

Павел
я имел ввиду, создать объект с конструктором БЕЗ ПАРАМЕТРОВ.
а потом вызвать функцию инициализации и туда все передать.

впрочем, в твоем случае, пожалуй, проще будет твой вариант...
 

crocodile2u

http://vbolshov.org.ru
До сих пор не понимаю, что ты хочешь сказать. Сама задача, с твоей помощью, решена - теперь остался чисто спортивный интерес. Если ты приведешь код (в этом треде, в личку, на мыло) - скажу спасибо (пивом угощу :))) ).

Только один момент: если твой спосбо предполагает каким-то образом менять структуру классов приложения (добавлять новые и т. д.) - имхо, это минус. Также минусом я посчитаю и наложение _любых_ требований к интерфейсу классов (если, например, твой способ предполагает, что у любого класса имеется функция инициализации).
 

svetasmirnova

маленький монстрик
crocodile2u
Я думаю это он хотел сказать:
PHP:
class A
{
public function __construct($arg1=null, ...) {
if (0 !== func_num_args()) {
var_dump(func_get_args());
}
}
}

function test() {
$temp = new A;
call_user_func_array(array($temp, '__construct'), func_get_args());
}
У тебя прямее
 

crocodile2u

http://vbolshov.org.ru
svetasmirnova
Ну да, возможно...

Но это, действительно, накладывает требование на конструктор любого класса, экземпляры которого будут создаваться таким способом: конструктор должен иметь возможность быть вызванным без параметров.

Кстати, Reflection API в последнем случае не нужен - это плюс. А минусы - неуниверсальность и необходимость два раза выполнять фактически одно и то же действие.
 
Сверху