bug80929.phpt 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. --TEST--
  2. Bug #80929: Method name corruption related to zend_closure_call_magic
  3. --FILE--
  4. <?php
  5. class DefaultListener
  6. {
  7. public function handleDefaultEvent($event) { }
  8. }
  9. class SubscriberProxy
  10. {
  11. private array $subscribedEvents;
  12. private object $subscriber;
  13. private Closure $listener;
  14. public function __construct(array $subscribedEvents, object $subscriber)
  15. {
  16. $this->subscribedEvents = $subscribedEvents;
  17. $this->subscriber = $subscriber;
  18. foreach ($this->subscribedEvents as $eventName => $params) {
  19. $this->listener = Closure::fromCallable([$this, $params]);
  20. }
  21. }
  22. public function __call(string $name, array $arguments)
  23. {
  24. return $this->subscriber->$name(...$arguments);
  25. }
  26. public function dispatch($event, string $eventName)
  27. {
  28. ($this->listener)($event, $eventName, null);
  29. }
  30. }
  31. $proxy = new SubscriberProxy(
  32. ['defaultEvent' => 'handleDefaultEvent'],
  33. new DefaultListener()
  34. );
  35. for ($i = 0; $i < 10; $i++) {
  36. echo $i . PHP_EOL;
  37. $proxy->dispatch(null, 'defaultEvent');
  38. }
  39. ?>
  40. --EXPECT--
  41. 0
  42. 1
  43. 2
  44. 3
  45. 4
  46. 5
  47. 6
  48. 7
  49. 8
  50. 9