2010-09-12 38 views
5

He estado usando el siguiente enfoque:Funciones que se puede llamar una sola vez

$foo_called = false; 

function foo() 
{ 
    if($foo_called) 
    { 
     return; 
    } 

    $foo_called = true; 

    // do something. 
} 

Me he estado preguntando si existía una mejor/enfoques diferentes.

+0

Bueno, para empezar, eso ni siquiera hará lo que quiere que haga, porque '$ foo_called' no existe en el ámbito de la función. Debería declararlo como una variable global dentro de la función para que este enfoque funcione. – Hammerite

+0

@Hammerite: Eso es correcto. Cambié el código para abordar el problema del alcance. –

Respuesta

8

Sólo por la claridad del código, me gustaría hacer algo como esto:

function foo() 
{ 
    static $foo_called = false; 
    if (!$foo_called) { 
     $foo_called = true; 
     // etc. 
    } 
} 
+0

Tienes razón. Arreglé el fragmento para abordar eso. –

3

Se puede usar un static variable:

function foo() { 
    static $foo_called = false; 
    if ($foo_called) return; 

    $foo_called = true; 

    // do something. 
} 
1

Mira el singleton pattern?

del manual "El patrón Singleton se aplica a situaciones en las que debe haber una única instancia de una clase. El ejemplo más común es una conexión de base de datos. La implementación de este patrón permite que un programador haga fácilmente esta sola instancia accesible por muchos otros objetos ".

1

No puedo pensar en una igualmente simple de inmediato. Esto es simple y confiable. Supongo que olvidó el global allí, pero de lo contrario debería funcionar bien.

1

Depende mucho del contexto y la razón por la que desea que la función se llama sólo una vez.

Si su función está allí para inicializar algo o comenzar algo, su enfoque está bien. Otra cosa que podrías hacer, si estás inicializando algo, es probar si existe o no lo que quieres inicializar.

function initSomething() { 
    if (isSomethingInit()) return; 

    // Init Something 
} 

Si está utilizando aquellos función de devolución de llamada a algo, puede utilizar la declaración lambda en lugar de declarar una función. Esto asegurará que su función solo sea llamada desde ciertos lugares.

function somethingWithCallback($callback) { 
    $callback(5); 
} 

somethingWithCallback(function ($e) {echo $e;}); 
0

Sé que la pregunta es anterior, pero me gusta mi solución y quiero compartirla.

$triggered = false; 
$trigger = function($callback)use(&$triggered){ 
    if(!$triggered){ 
     $callback(); 
      $triggered = true; 
    } 
}; 

foreach(['Hello','World', 'Wuhuu!'] as $value) { 
    $value = ' ' . $value; 

    $trigger(function()use(&$value){ // will only run once 
     $value = trim($value); 
    }); 

    echo $value; 
} 
Cuestiones relacionadas