2010-09-12 10 views
5

Używam następujące podejście:Funkcje, które można nazwać tylko raz

$foo_called = false; 

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

    $foo_called = true; 

    // do something. 
} 

Zastanawiałem się, czy istniała lepiej/różne podejścia.

+0

Cóż, na początek, to nawet nie zrobi tego, co chcesz, ponieważ '$ foo_called' nie istnieje w zakresie funkcji. Będziesz musiał zadeklarować ją jako zmienną globalną w funkcji tego podejścia do pracy. – Hammerite

+0

@Hammerite: Zgadza się. Zmieniłem kod, aby rozwiązać problem z zasięgiem. –

Odpowiedz

8

Tylko dla kodu jasności, chciałbym zrobić coś takiego:

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

Masz rację. Naprawiłem fragment kodu, aby to rozwiązać. –

3

Można użyć static variable:

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

    $foo_called = true; 

    // do something. 
} 
1

Spójrz na singleton pattern?

z instrukcji "Wzorzec Singleton odnosi się do sytuacji, w których musi występować pojedyncza instancja klasy, której najpowszechniejszym przykładem jest połączenie z bazą danych. Implementacja tego wzorca pozwala programiście na łatwe wykonanie tego pojedynczego wystąpienia dostępne przez wiele innych obiektów. "

1

Nie mogę od razu myśleć o równie prostym. Jest to proste i niezawodne. Przypuszczam, że zapomniałeś tam o global, ale poza tym powinno działać dobrze.

1

to zależy dużo kontekstu i powodu chcesz funkcja być wywołana tylko raz.

Jeśli masz funkcję inicjowania czegoś lub uruchamiania czegoś, podejście jest w porządku. Inną rzeczą, którą możesz zrobić, jeśli coś zainicjujesz, jest sprawdzenie, czy to, co chcesz zainicjować, istnieje, czy nie.

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

    // Init Something 
} 

Jeśli używasz tych funkcji jako wywołania zwrotnego, możesz użyć deklaracji lambda zamiast deklarowania funkcji. Zapewni to, że twoja funkcja będzie wywoływana tylko z określonych miejsc.

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

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

Wiem, że pytanie jest stary, ale podoba mi się moje rozwiązanie i chcesz go udostępnić.

$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; 
}