Могу ли я назначить функцию в переполнении стека

Я хочу знать, могу ли я назначить функцию.

У меня есть вызов функции 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);

или как я могу реализовать эту цель? Благодарю.

0

Решение

Обновить
Резюме ответа ниже. Если обе функции принимают одинаковые аргументы в одинаковом порядке, вы можете просто использовать переменные функции:

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

0

Другие решения

Вы можете добавить переключатель внутри функции. Который может выглядеть так:

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
}
0

Вы не можете переназначить такую ​​функцию. Лучшее, что вы можете сделать, это инкапсулировать if-else в вспомогательную функцию:

function mpurlx($s, $pagevar, $pages) {
if (strpos($s, 'sign') !== false) {
mpurl($s, $pagevar, $pages);
} else {
my_mpurl($s, $pagevar, $pages);
}
}

Затем выполните поиск & заменить на другой код, чтобы он вызывал вспомогательную функцию везде.

0
По вопросам рекламы [email protected]