Я пытаюсь написать помощник вида, который динамически вызывает других помощников, и у меня возникают проблемы с передачей более одного аргумента. Следующий сценарий будет работать:
$helperName = "foo";
$args = "apples";
$helperResult = $this->view->$helperName($args);
Тем не менее, я хочу сделать что-то вроде этого:
$helperName = "bar";
$args = "apples, bananas, oranges";
$helperResult = $this->view->$helperName($args);
с этим:
class bar extends AbstractHelper
{
public function __invoke($arg1, $arg2, $arg)
{
...
но это проходит "apples, bananas, oranges"
в $arg1
и ничего с другими аргументами.
Я не хочу посылать несколько аргументов при вызове помощника, потому что разные помощники принимают разное количество аргументов. Я не хочу, чтобы мои помощники принимали аргументы в виде массива, потому что код в остальной части проекта вызывает помощников с осторожными аргументами.
Твоя проблема в том, что звонишь
$helperName = "bar";
$args = "apples, bananas, oranges";
$helperResult = $this->view->$helperName($args);
будет интерпретироваться как
$helperResult = $this->view->bar("apples, bananas, oranges");
поэтому вы вызываете метод только с первым параметром.
Для достижения ожидаемого результата посмотрите функцию php call_user_func_array
,
http://php.net/manual/en/function.call-user-func-array.php
пример:
$args = array('apple', 'bananas', 'oranges');
$helperResult = call_user_func_array(array($this->view, $helperName), $args);
Для вашего случая вы можете использовать функция php call_user_func_array
так как ваш помощник является вызываемым и вы хотите передать массив аргументов.
// Define the callable
$helper = array($this->view, $helperName);
// Call function with callable and array of arguments
call_user_func_array($helper, $args);
Если вы используете php> = 5.6, вы можете использовать функцию variadic вместо func_get_args ().
Пример:
<?php
function f($req, $opt = null, ...$params) {
// $params is an array containing the remaining arguments.
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>