Как избежать вызова функции php при передаче переменной функции?

#php #function #parameters

#php #функция #параметры

Вопрос:

У меня есть функциональная переменная, подобная этой…

 $aName = "My Name";
  

Функция должна передаваться следующим образом:

 $sayHelloFunction = function sayHello($aName){
       echo($aName);
} 
  

Кроме того, у меня есть метод, который отвечает за выполнение функции sayHelloFunction:

 runningFunction($sayHelloFunction($aName));
  

в runningFunction у нее будет некоторое условие для выполнения функции, но когда я передаю «$sayHelloFunction($aName)» в runningFunction, она выполняется автоматически, но я хотел бы также передать переменную $ aName, как я могу этого добиться? Спасибо.

Комментарии:

1. я думаю, вы путаете php и javascript

2. @Ibrahim — это совершенно правильный вопрос PHP.

Ответ №1:

 runningFunction($sayHelloFunction, $aName);
  

Simples.

Комментарии:

1. но для моей функции sayHelloFunction требуется параметр, и я не хочу назначать параметр внутри функции runningFunction…..

Ответ №2:

Вам придется передавать аргументы отдельно. Однако вы могли бы обернуть их в массив, чтобы вы могли передавать их runningFunction в качестве одного аргумента, например:

 $printFunction = function($args) {
    print $args['lastname'].', '.$args['firstname'];
};

function runningFunction($f, $a) {
    $f($a);
}

$firstname = 'Bob';
$lastname = 'Smith';

$functionArguments = array(
    'firstname' => $firstname,
    'lastname' => $lastname
);

runningFunction($printFunction, $functionArguments);
  


Если вы хотите, чтобы ваши динамические функции получали «правильные» аргументы, то я не вижу способа обойти что-то подобное:

 function runningFunction($f, $a) {
    switch(count($a)) {
        0: $f(); break;
        1: $f($a[0]); break;
        2: $f($a[0], $a[1]); break;
        3: $f($a[0], $a[1], $a[2]); break;
        // and so on
    }
}
  

Комментарии:

1. call_user_func_array() в основном делает то, что вы сделали в своем switch заявлении.

Ответ №3:

Передайте параметры в виде массива, а затем используйте call_user_func_array() для вызова вашей функции.

Таким образом, ваш runningFunction() будет абсолютно абстрактным (как вы и просили), он может вызывать функции любого типа, вы несете ответственность за передачу правильного количества параметров.

 function runningFunction ($callback, $parameters=array()) {
    call_user_func_array($callback, $parameters);
}

runningFunction($sayHelloFunction, array($aName));
  

call_user_func_array()

Ответ №4:

как предложил xconspirisist, передайте $aName в качестве отдельного параметра функции.

Подробную информацию о функциях переменных можно найти на сайте PHP.

Комментарии:

1. Я хочу сделать runningFunction абстрактной, которая не зависит от функции $sayHelloFunction, я не возражаю передать runningFunction еще один параметр, но я рассматриваю, если у меня есть еще один параметр require, например, $ sayHelloFunctionAgain , который требует двух параметров, $ aName, $ aTime , тогда мне нужно написать еще один параметр для runningFunction , это не то, что я хочу….

Ответ №5:

Используйте анонимную функцию при вызове runningFunction

 function runningFunction($func) {
    $func();
}

runningFunction(function() {
    $sayHelloFunction($aName));
    // You can do more function calls here...
});