Zmienne PHP w funkcjach anonimowych

119

Bawiłem się anonimowymi funkcjami w PHP i zdałem sobie sprawę, że wydają się nie docierać do zmiennych poza nimi. Czy jest jakiś sposób na obejście tego problemu?

Przykład:

$variable = "nothing";

functionName($someArgument, function() {
  $variable = "something";
});

echo $variable;  //output: "nothing"

Spowoduje to wyświetlenie „nic”. Czy istnieje sposób, aby funkcja anonimowa mogła uzyskać dostęp do $variable?

einord
źródło

Odpowiedzi:

277

Tak, użyj zamknięcia :

functionName($someArgument, function() use(&$variable) {
  $variable = "something";
});

Zauważ, że abyś mógł modyfikować $variablei pobierać zmodyfikowaną wartość poza zasięgiem funkcji anonimowej, musisz odwoływać się do niej w zamknięciu za pomocą &.

nickb
źródło
Jest nowe! Jest to nowa składnia w PHP 5.3.
Rocket Hazmat,
1
@Rocket Tak więc, aby być uczciwym, jest to prawdziwa anonimowa składnia funkcji (w przeciwieństwie do create_function()), a usesłowo kluczowe jest udokumentowane (źle) na tej samej stronie dokumentu, która je opisuje.
DaveRandom,
4
Krótka uwaga dla tych, którzy mogą nie wiedzieć: Możesz upuścić &przy przekazywaniu obiektu, ponieważ są one zawsze przekazywane przez odniesienie ... i nie zapomnij o swojej podpowiedzi do typu :) Np .:function() use (PDO $pdo) {
keyboardSmasher
@Alliswell Nie, to tylko dla obiektów, w przeciwnym razie musisz przekazać przez odniesienie, aby zmodyfikować zmienną. Zobacz ten przykład .
nickb