У меня проблема с кодом, которая связана с тем, что я использую определенные библиотеки кода, которые я не могу изменить.Пропустить переменное число параметров без вызова_user_func_array()
Я использую следующий код, чтобы передать выполнение каких-либо неопределенных методов другому классу, и он работает нормально, но кажется, что удвоение отходов.
Любые предложения?
В принципе, я хочу знать, можно ли передать неизвестное количество параметров методу (без использования call_user_func_array()
, на случай, если они должны быть переданы по ссылке). Я не спрашиваю, как использовать func_get_args()
, скорее наоборот.
Или я должен просто разрешить еще несколько аргументов в первом логическом пути (код list()
)?
class Foo {
__construct() {
$this->external = new ClassThatIHaveNoControlOver();
}
function bar($name) {
return 'Hi '.$name;
}
function __call($method, $arguments) {
if (count($arguments) < 3) {
// call_user_func_array won't pass by reference, as required by
// ClassThatIHaveNoControlOver->foobar(), so calling the function
// directly for up to 2 arguments, as I know that foobar() will only
// take 2 arguments
list($first, $second) = $arguments + Array(null, null);
return $this->external->$method($first, $second);
} else {
return call_user_func_array(array($this->external, $method), $arguments);
}
}
}
$foo = new Foo();
$firstName = 'Bob';
$lastName = 'Brown';
echo $foo->bar($firstName); // returns Hi Bob as expected
echo $foo->foobar($firstName, $lastName); // returns whatever
// ClassThatIHaveNoControlOver()->foobar() is meant to return
EDIT Просто чтобы прояснить, я знаю, что могу использовать this метод реорганизовывать параметры как ссылки, но это означало бы, проходя все в качестве ссылки, даже если метод не требует этого - кое-что Я пытался избежать, но сейчас кажется маловероятным.
«на всякий случай, если их нужно передать по ссылке» - какой-либо действительный пример этого? Любая причина этого? – zerkms
@zerkms Методы, которые не входят в мой класс, передаются на другой класс, который нужно обрабатывать, а некоторые требуют, чтобы аргументы передавались по ссылке (см. Код). Я не включил этот класс, потому что я не контролирую Это. –
См. Http://stackoverflow.com/questions/295016/is-it-possible-to-pass-parameters-by-reference-using-call-user-func-array, http://stackoverflow.com/questions/6259713/why-do-phps-call-user-func-function-not-support-through-by-reference – CBusBus