2013-02-23 11 views
24

Chcę napisać funkcję, która wykonuje pewną brudną pracę podczas rejestrowania transakcji, ale zakres anonimowy funkcji nie wydaje się rejestrować zmiennych rodzica $db i $value zmiennych. Jak mogę przekazać zmienne do zamknięcia?Dostęp do zmiennych z zakresu nadrzędnego w anonimowej funkcji PHP

Jak na ironię, znaczek SO "zamknięcia" nie opisuje bardzo dokładnie wersji PHP ...?

class controller 
{ 
    function submit() 
    { 
     $db = new database(); 
     $result = $db->execute_tx(function() { 
      $db->insert_model_a($value_a); // ERROR: $db is non-object 
      $db->insert_model_b($value_b); 
     }); 
    } 
} 

class database 
{ 
    function execute_tx($atomic_action) 
    { 
     try 
     { 
      $this->start(); 
      $atomic_action(); 
      $this->commit(); 
      // etc.. 
     } 
     catch(...) 
     { 
      $this->rollback(); 
      // etc.. 
     } 
     finally 
     { 
      // etc.. 
     } 
    } 

    function insert_model_a() { ... } 
    function insert_model_b() { ... } 
} 

Odpowiedz

46

Użyj słowa kluczowego use wiązać zmienne do zakresu funkcji.

function() use ($db) { 

Zamknięcia mogą również dziedziczyć zmienne z zakresu nadrzędnego. Wszelkie takie zmienne muszą być zadeklarowane w nagłówku funkcji [using use].

http://www.php.net/manual/en/functions.anonymous.php

+1

Czy to jest jedyny sposób? Ponieważ w niektórych przypadkach mam od 10 do 15 wartości i mam wiele zgłoszeń do przejrzenia ... – Jake

+0

Tak. Musisz jawnie zaimportować zmienne, które mają zostać zamknięte. – salathe

+0

Nie zapominaj, że możesz przekazywać zmienne za pomocą normalnych argumentów funkcji. – salathe

Powiązane problemy