|
| 1 | +--TEST-- |
| 2 | +Generic closures and arrow functions |
| 3 | +--FILE-- |
| 4 | +<?php |
| 5 | +declare(strict_types=1); |
| 6 | + |
| 7 | +// Generic closure |
| 8 | +$identity = function<T>(T $value): T { |
| 9 | + return $value; |
| 10 | +}; |
| 11 | + |
| 12 | +echo $identity(42) . "\n"; // 42 |
| 13 | +echo $identity("hello") . "\n"; // hello |
| 14 | + |
| 15 | +// Generic arrow function |
| 16 | +$wrap = fn<T>(T $x): array => [$x]; |
| 17 | +var_dump($wrap(42)); // array(1) { [0]=> int(42) } |
| 18 | +var_dump($wrap("hello")); // array(1) { [0]=> string(5) "hello" } |
| 19 | + |
| 20 | +// Generic closure with constraint |
| 21 | +$count = function<T: Countable>(T $item): int { |
| 22 | + return count($item); |
| 23 | +}; |
| 24 | + |
| 25 | +echo $count(new ArrayObject([1, 2, 3])) . "\n"; // 3 |
| 26 | + |
| 27 | +// Multiple type params |
| 28 | +$pair = fn<A, B>(A $a, B $b): array => [$a, $b]; |
| 29 | +var_dump($pair(1, "two")); // array(2) { [0]=> int(1) [1]=> string(3) "two" } |
| 30 | + |
| 31 | +// Reflection on generic closures |
| 32 | +$rf = new ReflectionFunction($identity); |
| 33 | +var_dump($rf->isGeneric()); // true |
| 34 | +$params = $rf->getGenericParameters(); |
| 35 | +echo "identity generic params: " . count($params) . "\n"; |
| 36 | +echo " T: " . $params[0]->getName() . "\n"; |
| 37 | + |
| 38 | +// Reflection on generic arrow function |
| 39 | +$rf2 = new ReflectionFunction($wrap); |
| 40 | +var_dump($rf2->isGeneric()); // true |
| 41 | + |
| 42 | +// Non-generic closure for comparison |
| 43 | +$plain = function(int $x): int { return $x * 2; }; |
| 44 | +$rf3 = new ReflectionFunction($plain); |
| 45 | +var_dump($rf3->isGeneric()); // false |
| 46 | + |
| 47 | +echo "OK\n"; |
| 48 | +?> |
| 49 | +--EXPECT-- |
| 50 | +42 |
| 51 | +hello |
| 52 | +array(1) { |
| 53 | + [0]=> |
| 54 | + int(42) |
| 55 | +} |
| 56 | +array(1) { |
| 57 | + [0]=> |
| 58 | + string(5) "hello" |
| 59 | +} |
| 60 | +3 |
| 61 | +array(2) { |
| 62 | + [0]=> |
| 63 | + int(1) |
| 64 | + [1]=> |
| 65 | + string(3) "two" |
| 66 | +} |
| 67 | +bool(true) |
| 68 | +identity generic params: 1 |
| 69 | + T: T |
| 70 | +bool(true) |
| 71 | +bool(false) |
| 72 | +OK |
0 commit comments