Я хочу знать, могу ли я назначить функцию.
У меня есть вызов функции mpurl($s, $pagevar, $pages)
этот вызов функции происходит много раз в моем коде. Теперь я хочу добавить больше случаев для этой функции. лайк:
if(strpos($s, 'sign') !== false) {
mpurl($s, $pagevar, $pages);
} else {
my_mpurl($s, $pagevar, $pages);
}
Я не хочу использовать это if-else при каждом вызове функции mpurl, поэтому я хочу изменить значение функции mpurl глобально.
Итак, возникает вопрос: могу ли я написать так:
if(strpos($s, 'sign') === false) {
mpurl = my_mpurl;
}
mpurl($s, $pagevar, $pages);
или как я могу реализовать эту цель? Благодарю.
Обновить
Резюме ответа ниже. Если обе функции принимают одинаковые аргументы в одинаковом порядке, вы можете просто использовать переменные функции:
if (strpos($s, 'sign') === false) {
$func = 'my_mpurl';
} else {
$func = 'mpurl';
}
$func($s, $pagevar, $pages);
Если по какой-либо причине вы не можете выполнить обновление и застряли на более старой версии, вы можете использовать call_user_func_array
:
if (strpos($s, 'sign') === false) {
$func = 'my_mpurl';
} else {
$func = 'mpurl';
}
call_user_func_array($func, array($s, $pagevar, $pages));
Естественно, вы можете использовать $func
var столько, сколько вы хотите / нужно вызывать функцию всякий раз, когда вам нужно.
Таким образом, в основном, в зависимости от значения некоторой переменной, вы хотите вызвать другую функцию с одинаковыми аргументами. Это то что call_user_func_array
для:
if (strpos($s, 'sign') === false) {
$func = 'my_mpurl';
} else {
$func = 'mpurl';
}
call_user_func_array($func, array($a, $b, $c));
То же самое, но немного короче (и с коротким синтаксисом массива):
$func = 'mpurl';
if (strpos($s, 'sign') === false)
$func = 'my_'.$func;//prepend
call_user_func_array($func, [$s, $pagevar, $pages]);
//or even shorter
$func($s, $pagevar, $pages);
Значение переменной как синтаксис имени функции (переменной функции) было введено в PHP 5.3. Если вы еще не работаете на 5.3, вам действительно нужно обновить, но между тем вы можете использовать call_user_func_array
Вы можете добавить переключатель внутри функции. Который может выглядеть так:
function mpurl($a,$b,$c) {
switch ($a) {
case 'sign' :
// do some stuff
break;
default :
// do some other stuff
break;
}
// do some common stuff in the function
}
Другая возможность (на основе вашего комментария) может быть следующей. В том случае, если $a
равно ‘sign’, вы прекращаете выполнение остальной части функции и немедленно возвращаете результат. В других случаях вы продолжаете выполнять оставшуюся часть функции.
function mpurl($a,$b,$c) {
switch ($a) {
case 'sign' :
// do some stuff
return $result;
break;
default :
// do some other stuff
break;
}
// do some common stuff in the function
}
Вы не можете переназначить такую функцию. Лучшее, что вы можете сделать, это инкапсулировать if-else в вспомогательную функцию:
function mpurlx($s, $pagevar, $pages) {
if (strpos($s, 'sign') !== false) {
mpurl($s, $pagevar, $pages);
} else {
my_mpurl($s, $pagevar, $pages);
}
}
Затем выполните поиск & заменить на другой код, чтобы он вызывал вспомогательную функцию везде.