Ik was vandaag even aan het experimenteren met php:
Ik had verwacht dat hieruit de volgende output zou komen:
in plaats daarvan krijg ik de volgende output:
Ligt het aan mij dat ik dit raar vind? Ik weet dat PHP het mogelijk maakt om tijdens de uitvoer willekeurige properties aan een object te hangen: als ik in de code $foo->blaa = 42; toevoeg levert dat niet eens een notice op (iets wat ik altijd al discutabel heb gevonden). Ik begrijp dat dit een issue is mbt backward compatibility. Maar dan nog, conceptueel gezien zou het niet uit mogen maken of ik een losstaande functie gebruik of een functie uit een object IMHO
Maak ik een denkfout? Is er een eenvoudige, doch elegante manier om dit op te lossen? Ik ben op de hoogte van call_user_func, maar dat kan ik moeilijk elegant noemen...
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
| function a() { echo "I'm a!" . PHP_EOL; } function b() { echo "I'm b!" . PHP_EOL; } function c($a) { $a(); } class obj { private $id; public function __construct($x) { $this->id = $x; } public function Bar() { echo "I'm " . $this->id . "!" . PHP_EOL; } } $foo = a; c($foo); $foo = b; c($foo); $obj = new obj("x"); $foo = $obj->Bar; c($foo); |
Ik had verwacht dat hieruit de volgende output zou komen:
code:
1
2
3
| I'm a! I'm b! I'm x! |
in plaats daarvan krijg ik de volgende output:
code:
1
2
3
| I'm a! I'm b! Fatal error: Function name must be a string |
Ligt het aan mij dat ik dit raar vind? Ik weet dat PHP het mogelijk maakt om tijdens de uitvoer willekeurige properties aan een object te hangen: als ik in de code $foo->blaa = 42; toevoeg levert dat niet eens een notice op (iets wat ik altijd al discutabel heb gevonden). Ik begrijp dat dit een issue is mbt backward compatibility. Maar dan nog, conceptueel gezien zou het niet uit mogen maken of ik een losstaande functie gebruik of een functie uit een object IMHO
Maak ik een denkfout? Is er een eenvoudige, doch elegante manier om dit op te lossen? Ik ben op de hoogte van call_user_func, maar dat kan ik moeilijk elegant noemen...