Variabelen importeren in een closure

In tegenstelling tot andere implementaties van closures moet je in PHP expliciet definiëren welke variabelen uit de huidige scope je wilt importeren.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$foo
= "Hello World";

$bar = function($baz) use ($foo) {
    echo $foo . ' and ' . $baz;
};

function
greet($greet_callback) {
    $greet_callback('others');
}


greet($bar);

/* resultaat:
Hello World and others
*/

?>



Variabelen importeren: by reference of niet?
WTF?!: In tegenstelling tot wat je zou verwachten wanneer je veel met Javascript hebt gewerkt importeert PHP de variabelen niet standaard by reference. Dit is wat onverwacht, aangezien het keyword 'global' dit wel doet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

$my_global_greet
= '* Silence *';

$bar_without_reference = function($baz) use ($my_global_greet) {
    $my_global_greet = 'Hello ' . $baz;
};


$bar_without_reference('Jelmer');

echo $my_global_greet;

/* Resultaat:
* Silence *
*/

/* Nu met reference (let op het &-teken!) */

$bar_with_reference = function($baz) use (&$my_global_greet) {
    $my_global_greet = 'Hello ' . $baz;
};


$bar_with_reference('Jelmer');

echo $my_global_greet;

/* Resultaat:
Hello Jelmer
*/

/* En ter demonstratie (let op het 'global' keyword) */

function bar_the_old_way($baz) {
    global $my_global_greet;
    
    $my_global_greet = 'Howdy ' . $baz;
}


bar_the_old_way('Jelmer');

echo $my_global_greet;

/* Resultaat:
Howdy Jelmer
*/

?>


Is dit ongewenst gedrag? Nee. Stel dat de makers ervoor hadden gekozen de weg van 'global' te kiezen, dan was het omslachtiger geweest om een niet-veranderende kopie van een variabele uit de bovenliggende scope te halen. Ook moet je nu expliciet aangeven dat je closure de geïmporteerde variabele mag veranderen, wat het WTF?!-gehalte van je code weer wat naar beneden haalt. Ezelsbruggetje: de schrijfwijze en werking van de argumenten van een functie komen overeen met de schrijfwijze en werking van het importeren van je variabelen bij een closure.

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Je eerste closure
  2. Variabelen importeren in een closure
  3. De scope van 'use'
  4. Closure en objecten
  5. WTF?! - de opsomming
  6. Disclaimer

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.