WTF?! - de opsomming
Dingen waar je dus even op moet letten, en die waarschijnlijk de eerste keren nog wel eens fout zullen gaan bij het gebruik van closures:
Variabelen importeren betekent kopiëren net zoals de argumenten die je aan een functie geeft. Wil je ze via een reference, dan moet je dat expliciet aangeven met een &-teken voor de variabelenaam.
Vergeet de punt-komma niet achter de afsluitende }. Direct aanroepen zoals in Javascript door er direct (args) achter te plaatsen kan niet.
Is je closure een property van een instantie? Dan kan je hem niet direct aanroepen omdat de Zend Engine dit zal zien als een method-aanroep. Een reference maken of __invoke aanroepen werkt wel
Wanneer je een closure binnen een object-context aanmaakt, wordt $this standaard voor je geïmporteerd. $this verwijst altijd naar de instantie waar de closure is aangemaakt.
En nog wat afsluitende Syntax-mogelijkheden:
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
class Number {
protected $factor;
public $multiplier;
public function __construct($factor) {
$this->factor = $factor;
$this->multiplier = function($a) {
return $a * $this->factor;
};
}
}
$foo = new Number(4);
/* Werkt wel: resultaat is 12 */
$foo_multiplier = $foo->multiplier;
echo $foo_multiplier(3);
/* Werkt ook: resultaat is 24 */
echo $foo->multiplier->__invoke(6);
/* Werkt niet: undefined method 'Foo::multiplier' */
$foo->multiplier(6);
?>
Inhoudsopgave
- Je eerste closure
- Variabelen importeren in een closure
- De scope van 'use'
- Closure en objecten
- WTF?! - de opsomming
- Disclaimer