Ik probeer een method uit een abstracte class the overriden waarbij ik ook de parent-method aan wil roepen.
De reden dat ik dit doe is dat de abstracte classe in een framework zit die ik dus niet aan kan passen en ik wil wat logging toevoegen op het moment dat die functie wordt aangesproken.
Het probleem is echter dat de method werkt met variabele argumenten en ik het niet voor elkaar krijg deze argumenten op een nette manier door te geven.
een versimpelde weergave van wat ik geprobeerd heb:
dit geeft de volgende output:
Deze output had ik ook wel verwacht, daar niet van, maar het leek me zinvol te vermelden dat dit dus niet werkt.
De enige oplossingen die ik kan verzinnen:
Kan iemand iets beters bedenken? Wellicht dat de Reflection classes toch op een andere manier uitkomst bieden?
De reden dat ik dit doe is dat de abstracte classe in een framework zit die ik dus niet aan kan passen en ik wil wat logging toevoegen op het moment dat die functie wordt aangesproken.
Het probleem is echter dat de method werkt met variabele argumenten en ik het niet voor elkaar krijg deze argumenten op een nette manier door te geven.
een versimpelde weergave van wat ik geprobeerd heb:
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
| abstract class Base { public function find() { $args = func_get_args(); echo __METHOD__." was called with ".count($args)." arguments: ".print_r($args, true)."<br>\n"; } } class Real extends Base { public function find() { $args = func_get_args(); echo __METHOD__." was called with ".count($args)." arguments: ".print_r($args, true)."<br>\n"; parent::find(func_get_args()); $method = new ReflectionMethod("Base", "find"); $method->invokeArgs(new Base(), $args); } } $real = new Real(); $real->find(1, 2, 3); |
dit geeft de volgende output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| Real::find was called with 3 arguments: Array ( [0] => 1 [1] => 2 [2] => 3 ) Base::find was called with 1 arguments: Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) Fatal error: Cannot instantiate abstract class Base |
Deze output had ik ook wel verwacht, daar niet van, maar het leek me zinvol te vermelden dat dit dus niet werkt.
De enige oplossingen die ik kan verzinnen:
- Met een switch statement werken en afhankelijk van count($args) de parent met bvb find($args[0], $args[1]) aanroepen.
- Door $args loopen en de argumenten als php-code maken en dan met eval gaan werken.
Kan iemand iets beters bedenken? Wellicht dat de Reflection classes toch op een andere manier uitkomst bieden?