2012-01-01 11 views
15

Quiero definir una función y desarmarla después de su uso tal como lo hacemos con las variables.¿Cómo desarmar una definición de función del mismo modo que desarmamos una variable?

$a = 'something'; 
unset($a); 
echo $a; // outputs nothing 

Al igual que este si declara una función callMethod(), ¿hay una manera de anular la configuración?

+3

¿Por qué quieres hacer esto? Además, ¿qué tiene esto que ver con la programación funcional? Creo que las funciones desechables van directamente contra FP. – BoltClock

+0

Todo lo que quiero es que la salida de get_defined_functions() no contenga el nombre de la función 'callMethod'. Si hay otra forma de hacerlo, por favor avíseme. – Vin

+0

¿Por qué, solo por diversión? Cualquiera que sea su problema real aquí, * suena * como si estuviera forzando la solución incorrecta. –

Respuesta

18

A partir de PHP 5.3, se puede asignar una anonymous function a una variable, entonces desasignarla:

$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 

Antes de 5.3, se puede hacer algo similar con 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 
+1

create_function() es la única solución aquí !! gracias – Vin

+1

Las funciones creadas con 'create_function' permanecerán en la memoria. Si muestra la variable, verá una cadena. Si usa esa cadena más adelante, verá que la función aún funciona aunque haya desarmado la variable. Así que diría 'create_function' simula lo que quieres pero no es lo que quieres. También podría usar funciones de variables, es lo mismo. – hakre

+0

Hay una respuesta más más abajo. –

1

De this question:

Usted puede utilizar rename_function

<?php 
rename_function('original_name', 'new_name'); 
?> 

y luego redeclare la función original.
override_function puede funcionar también.

Son parte del Zend PHP depurador, si eso no funciona, entonces siempre se puede intentar algo como:

function function1(){ 
echo "1"; 
} 

function function2(){ 
echo "2"; 
} 

$i = "function2"; 
$i(); // displays 2; 
+1

Sí, pero él quiere deshacerse de la función por completo. – BoltClock

+0

@BoltClock - Estaré de acuerdo con su comentario anterior. ¿Cómo es eso práctico? –

+4

'rename_function' es una parte del paquete [APD] (http://ru2.php.net/manual/en/book.apd.php), no disponible en las instalaciones estándar de PHP. –

2

Para los incrédulos, tiene mucho sentido que desee eliminar una función. Si tiene una función que utiliza una gran cantidad de datos una sola vez al comienzo de su secuencia de comandos, entonces querer eliminarla tiene sentido.

Uno de estos tipos de funciones puede ser la función de detección de móvil/tableta de un script o marco. Solo se necesita una vez y es probable que requiera una gran cantidad de memoria para una función que se ejecuta solo una vez. Si tiene alguna duda, marque https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.json

Dicho esto, hay una solución al problema sin la necesidad de eliminar la función. Por lo que vale, haz globales todas las matrices utilizadas por la función y al final de la función deshazte de todas. La función se mantiene, pero va la información voluminosa. Tenga en cuenta que cuando desarma una variable, depende del recolector de basura de PHP decidir cuándo se liberará la memoria. Y liberar la memoria quita ciclos de CPU de su aplicación. Realmente no puedo ver ningún script PHP que requiera desarmar una función.

+0

¿qué pasa con la [respuesta] (http://stackoverflow.com/a/16924339/1057527) de arriba? ¿Es eso una razón suficiente? También tuve ese problema antes. – machineaddict

10

runkit_function_remove-Retire una definición de función http://php.net/manual/en/function.runkit-function-remove.php

+1

La única respuesta aquí. ¿Por qué los otros se elevan? –

+1

También libera la memoria utilizada https://bugs.php.net/bug.php?id=57270 –

+3

Esto requiere PECL, por lo que no está fuera de la bolsa PHP. Buena función sin embargo. – Antony

Cuestiones relacionadas