Как отключить определение функции так же, как мы отключили переменную?
Я хочу определить функцию и отключить ее после ее использования так же, как мы делаем с переменными.
$a = 'something';
unset($a);
echo $a; // outputs nothing
Точно так же, если я объявляю функцию callMethod(), есть способ ее отменить?
Ответы
Ответ 1
Начиная с PHP 5.3, вы можете назначить анонимную функцию переменной, а затем отключить ее:
$upper = function($str) {
return strtoupper($str);
};
echo $upper('test1');
// outputs: TEST1
unset($upper);
echo $upper('test2');
// Notice: Undefined variable: upper
// Fatal error: Function name must be a string
До 5.3 вы можете сделать что-то подобное с create_function()
$func = create_function('$arg', 'return strtoupper($arg);');
echo $func('test1');
unset($func);
$func2 = "\0lambda_1";
echo $func2('test2.a'), "\n"; // Same results, this is the "unset" $func function
echo $func('test2.b'); // Fatal Error
Ответ 2
runkit_function_remove - удалите определение функции
http://php.net/manual/en/function.runkit-function-remove.php
Ответ 3
Для сомневающихся, имеет смысл хотеть удалить функцию. Если у вас есть функция, которая использует много данных только один раз в начале вашего script, тогда его нужно удалить.
Одной из таких функций может быть функция обнаружения мобильных/планшетов для script или фреймворка. Он нужен только один раз, и он, вероятно, займет значительную часть памяти для функции, которая выполняется только один раз. Если у вас есть какие-либо сомнения, отметьте https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.json
Это говорит о том, что существует проблема вокруг проблемы без необходимости удаления функции. Для чего это необходимо, сделайте глобальным все массивы, используемые функцией, а затем в конце функции их все отключите. Функция остается, но объемные данные идут. Обратите внимание, что когда вы отключаете переменную, сборщик мусора PHP может решить, когда будет освобождена память. И освобождение памяти занимает процессорные циклы от вашего приложения. Я действительно не вижу никакого PHP script, который потребует отключения функции.
Ответ 4
Из этот вопрос:
Вы можете использовать rename_function
<?php
rename_function('original_name', 'new_name' );
?>
а затем обновите исходную функцию.
override_function также может работать.
Они являются частью Zend PHP Debugger, если это не работает, вы всегда можете попробовать что-то вроде:
function function1(){
echo "1";
}
function function2(){
echo "2";
}
$i = "function2";
$i(); // displays 2;