call_user_func_array () аргументы со строками в качестве ключей для соответствия именам аргументов функции

0

На данный момент у меня есть что-то вроде этого

function callFunction($method, $args) {
    if(method_exists($this, $method)) {
            call_user_func_array(array($this, $method), $args);
    }
}

function myfunction ($hello, $world, $blah) {
}

где $args - это массив, такой как [0] => 'string1', [1] => 'string2', [2] => 'string3' который передается функции в этом порядке. Однако есть ли способ, чтобы ключи к аргументам соответствовали именам аргументов функций. как ['hello'] => 'string1', ['world'] => 'string2', ['blah'] => 'string3' где они могут быть в любом порядке и соответствовать правильному имени аргумента по ключу?

  • 0
    Для этого вам нужно использовать ReflectionMethod::getParameters() . Не реальная проблема, чтобы написать что-то для этого, но учтите, что это создает некоторые накладные расходы.
Теги:
function

1 ответ

2
Лучший ответ

Довольно некоторые накладные расходы, но возможно:

function callFunction($method, $args) {
    if(method_exists($this, $method)) {
         $arguments = array();
         $reflectionmethod = new ReflectionMethod($this,$method);
         foreach($reflectionmethod->getParameters() as $arg){
             if(isset($args[$arg->name])){
                 $arguments[$arg->name] = $args[$arg->name];
             } else if($arg->isDefaultValueAvailable()){
                 $arguments[$arg->name] = $arg->getDefaultValue();
             } else {
                 $arguments[$arg->name] = null;
             }
         }
         call_user_func_array(array($this, $method), $arguments);
    }
}

function myfunction ($hello, $world, $blah) {
}

Тем не менее, что-то, переданное по ссылке. Вероятно, вам понадобится еще один код для выполнения этой работы. Короче говоря: PHP не Python :)

  • 0
    Спасибо, я надеялся, что найдется способ для этого, но я подумал, что вам, возможно, придется сделать что-то подобное. Хороший ответ!
  • 0
    ReflectionMethod не имеет метода getArguments. Правильный - $ reflemethod-> getParameters () php.net/manual/ro/reflectionfunctionabstract.getparameters.php
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню