Как отключить определение функции так же, как мы отключили переменную?

Я хочу определить функцию и отключить ее после ее использования так же, как мы делаем с переменными.

$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

Ответ 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;