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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
*/
?>
$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)
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
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
*/
?>
$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.
« vorige pagina | volgende pagina »
Inhoudsopgave
- Je eerste closure
- Variabelen importeren in een closure
- De scope van 'use'
- Closure en objecten
- WTF?! - de opsomming
- Disclaimer