assign_coalesce_001.phpt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. --TEST--
  2. Coalesce assign (??=): Basic behavior
  3. --FILE--
  4. <?php
  5. // Refcounted values
  6. $foo = "fo";
  7. $foo .= "o";
  8. $bar = "ba";
  9. $bar .= "r";
  10. // Identity function used to track single-evaluation
  11. function id($arg) {
  12. echo "id($arg)\n";
  13. return $arg;
  14. }
  15. echo "Simple variables:\n";
  16. $a = 123;
  17. $a ??= 456;
  18. var_dump($a);
  19. $b = null;
  20. $b ??= $foo;
  21. var_dump($b);
  22. $c = $foo;
  23. $c ??= $bar;
  24. var_dump($c);
  25. $d ??= $foo;
  26. var_dump($c);
  27. echo "\nArrays:\n";
  28. $ary = [];
  29. $ary["foo"] ??= 123;
  30. $ary[$foo] ??= $bar;
  31. $ary[$bar] ??= $foo;
  32. var_dump($ary);
  33. $ary = [];
  34. $ary[id($foo)] ??= 123;
  35. $ary[id($foo)] ??= $bar;
  36. $ary[id($bar)] ??= $foo;
  37. var_dump($ary);
  38. echo "\nObjects:\n";
  39. $obj = new stdClass;
  40. $obj->foo ??= 123;
  41. $obj->$foo ??= $bar;
  42. $obj->$bar ??= $foo;
  43. var_dump($obj);
  44. $obj = new stdClass;
  45. $obj->{id($foo)} ??= 123;
  46. $obj->{id($foo)} ??= $bar;
  47. $obj->{id($bar)} ??= $foo;
  48. var_dump($obj);
  49. class Test {
  50. public static $foo;
  51. public static $bar;
  52. }
  53. echo "\nStatic props:\n";
  54. Test::$foo ??= 123;
  55. Test::$$foo ??= $bar;
  56. Test::$$bar ??= $foo;
  57. var_dump(Test::$foo, Test::$bar);
  58. Test::$foo = null;
  59. Test::$bar = null;
  60. Test::${id($foo)} ??= 123;
  61. Test::${id($foo)} ??= $bar;
  62. Test::${id($bar)} ??= $foo;
  63. var_dump(Test::$foo, Test::$bar);
  64. ?>
  65. --EXPECT--
  66. Simple variables:
  67. int(123)
  68. string(3) "foo"
  69. string(3) "foo"
  70. string(3) "foo"
  71. Arrays:
  72. array(2) {
  73. ["foo"]=>
  74. int(123)
  75. ["bar"]=>
  76. string(3) "foo"
  77. }
  78. id(foo)
  79. id(foo)
  80. id(bar)
  81. array(2) {
  82. ["foo"]=>
  83. int(123)
  84. ["bar"]=>
  85. string(3) "foo"
  86. }
  87. Objects:
  88. object(stdClass)#1 (2) {
  89. ["foo"]=>
  90. int(123)
  91. ["bar"]=>
  92. string(3) "foo"
  93. }
  94. id(foo)
  95. id(foo)
  96. id(bar)
  97. object(stdClass)#2 (2) {
  98. ["foo"]=>
  99. int(123)
  100. ["bar"]=>
  101. string(3) "foo"
  102. }
  103. Static props:
  104. int(123)
  105. string(3) "foo"
  106. id(foo)
  107. id(foo)
  108. id(bar)
  109. int(123)
  110. string(3) "foo"