2013-09-04 19 views
14

Jestem trochę zdezorientowany z zamknięciami PHP. Czy ktoś może wyjaśnić to dla mnie:Zamieszanie z identyfikatorem "użytkowania" w zamknięciach PHP

// Sample PHP closure 
my_method(function($apples) use ($oranges) { 
    // Do something here 
}); 

Jaka jest różnica między $apples i $oranges i kiedy należy używać każdego?

+0

Możliwe duplikat (http://stackoverflow.com/questions/1065188/in- php-5-3-0-co-jest-funkcja-użyj-identyfikator) – Trix

Odpowiedz

16

$apples przyjmie wartość przekazaną do funkcji po jej wywołaniu, np.

function my_method($callback) { 
    // inside the callback, $apples will have the value "foo" 
    $callback('foo'); 
} 

$oranges będzie odnosić się do wartości zmiennej $oranges który istnieje w zakresie, w którym zdefiniowane zamknięcie. Np .:

$oranges = 'bar'; 

my_method(function($apples) use ($oranges) { 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

Różnice że $oranges jest zobowiązany, gdy funkcja jest zdefiniowanai $apples jest zobowiązany, gdy funkcja jest nazywa.


Zamknięcia umożliwiają dostęp do zmiennych zdefiniowanych poza funkcją, ale musisz wyraźnie powiedzieć PHP, które zmienne powinny być dostępne. Jest to podobne (ale nie równowartość!), Aby za pomocą słowa kluczowego global jeśli zmienna jest zdefiniowana w globalnym zakresie:

$oranges = 'bar'; 

my_method(function($apples) { 
    global $oranges; 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

różnice między używaniem zamknięć i global:

  • Można powiązać lokalnej zmienne do zamknięć, global działa tylko ze zmiennymi globalnymi.
  • Zamknięcia wiążą wartość o wartości zmiennej w momencie zamknięcia zdefiniowane jako. Zmiany zmiennych po zdefiniowaniu funkcji nie mają na nie wpływu.
    Z drugiej strony, jeśli użyjesz global, otrzymasz wartość, którą ma zmienna w momencie, gdy funkcja jest o nazwie.

    Przykład [? W PHP 5.3.0, co jest funkcją "stosowanie" identyfikator]

    $foo = 'bar'; 
    $closure = function() use ($foo) { 
        echo $foo; 
    }; 
    $global = function() { 
        global $foo; 
        echo $foo; 
    }; 
    
    $foo = 42; 
    $closure(); // echos "bar" 
    $global(); // echos 42 
    
+0

Czym różni się od używania 'global', ponieważ to pierwsza rzecz, która przyszła mu do głowy. – enchance

+0

@enchance: Ponieważ 'use' może uzyskać dostęp do zmiennych w zasięgu lokalnym. Kiedy użyjesz '$ (oranges)', '$ oranges' nie musi być globalne, tak jak robi to' global $ oranges; '. –

+1

'global' ** nie jest ** odpowiednikiem' use', ponieważ 'global' odnosi się do czystego kontekstu globalnego (reprezentowanego również przez' $ GLOBALS'), podczas gdy 'use' przejdzie tylko bieżący, lokalny kontekst. –

3

$apples jest przekazywana jako argument do my_method, a $oranges jest wstrzykiwany do środka.