unpack.phpt 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. --TEST--
  2. Unpacking named parameters
  3. --FILE--
  4. <?php
  5. function test($a, $b, $c) {
  6. echo "a = $a, b = $b, c = $c\n";
  7. }
  8. function test2($a = null, &$b = null) {
  9. $b++;
  10. }
  11. test(...['a' => 'a', 'b' => 'b', 'c' => 'c']);
  12. test(...['c' => 'c', 'b' => 'b', 'a' => 'a']);
  13. test(...['a', 'b' => 'b', 'c' => 'c']);
  14. try {
  15. test(...['a', 'b' => 'b', 'c']);
  16. } catch (Error $e) {
  17. echo $e->getMessage(), "\n";
  18. }
  19. try {
  20. test(...['a', 'a' => 'a']);
  21. } catch (Error $e) {
  22. echo $e->getMessage(), "\n";
  23. }
  24. $ary = ['b' => 0];
  25. $ary2 = $ary;
  26. test2(...$ary);
  27. var_dump($ary, $ary2);
  28. test(...new ArrayIterator(['a' => 'a', 'b' => 'b', 'c' => 'c']));
  29. test(...new ArrayIterator(['c' => 'c', 'b' => 'b', 'a' => 'a']));
  30. test(...new ArrayIterator(['a', 'b' => 'b', 'c' => 'c']));
  31. try {
  32. test(...new ArrayIterator(['a', 'b' => 'b', 'c']));
  33. } catch (Error $e) {
  34. echo $e->getMessage(), "\n";
  35. }
  36. try {
  37. test(...new ArrayIterator(['a', 'a' => 'a']));
  38. } catch (Error $e) {
  39. echo $e->getMessage(), "\n";
  40. }
  41. $ary = ['b' => 0];
  42. $ary2 = $ary;
  43. test2(...new ArrayIterator($ary));
  44. var_dump($ary, $ary2);
  45. ?>
  46. --EXPECTF--
  47. a = a, b = b, c = c
  48. a = a, b = b, c = c
  49. a = a, b = b, c = c
  50. Cannot use positional argument after named argument during unpacking
  51. Named parameter $a overwrites previous argument
  52. array(1) {
  53. ["b"]=>
  54. int(1)
  55. }
  56. array(1) {
  57. ["b"]=>
  58. int(0)
  59. }
  60. a = a, b = b, c = c
  61. a = a, b = b, c = c
  62. a = a, b = b, c = c
  63. Cannot use positional argument after named argument during unpacking
  64. Named parameter $a overwrites previous argument
  65. Warning: Cannot pass by-reference argument 2 of test2() by unpacking a Traversable, passing by-value instead in %s on line %d
  66. array(1) {
  67. ["b"]=>
  68. int(0)
  69. }
  70. array(1) {
  71. ["b"]=>
  72. int(0)
  73. }