summaryrefslogtreecommitdiff
path: root/Zend/tests/assign_coalesce_001.phpt
blob: 163f72f051130baaf20cbd4994ca2428a9f6f912 (plain)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
--TEST--
Coalesce assign (??=): Basic behavior
--FILE--
<?php

// Refcounted values
$foo = "fo";
$foo .= "o";
$bar = "ba";
$bar .= "r";

// Identity function used to track single-evaluation
function id($arg) {
    echo "id($arg)\n";
    return $arg;
}

echo "Simple variables:\n";
$a = 123;
$a ??= 456;
var_dump($a);

$b = null;
$b ??= $foo;
var_dump($b);

$c = $foo;
$c ??= $bar;
var_dump($c);

$d ??= $foo;
var_dump($c);

echo "\nArrays:\n";
$ary = [];
$ary["foo"] ??= 123;
$ary[$foo] ??= $bar;
$ary[$bar] ??= $foo;
var_dump($ary);

$ary = [];
$ary[id($foo)] ??= 123;
$ary[id($foo)] ??= $bar;
$ary[id($bar)] ??= $foo;
var_dump($ary);

echo "\nObjects:\n";
$obj = new stdClass;
$obj->foo ??= 123;
$obj->$foo ??= $bar;
$obj->$bar ??= $foo;
var_dump($obj);

$obj = new stdClass;
$obj->{id($foo)} ??= 123;
$obj->{id($foo)} ??= $bar;
$obj->{id($bar)} ??= $foo;
var_dump($obj);

class Test {
    public static $foo;
    public static $bar;
}

echo "\nStatic props:\n";
Test::$foo ??= 123;
Test::$$foo ??= $bar;
Test::$$bar ??= $foo;
var_dump(Test::$foo, Test::$bar);

Test::$foo = null;
Test::$bar = null;
Test::${id($foo)} ??= 123;
Test::${id($foo)} ??= $bar;
Test::${id($bar)} ??= $foo;
var_dump(Test::$foo, Test::$bar);

?>
--EXPECT--
Simple variables:
int(123)
string(3) "foo"
string(3) "foo"
string(3) "foo"

Arrays:
array(2) {
  ["foo"]=>
  int(123)
  ["bar"]=>
  string(3) "foo"
}
id(foo)
id(foo)
id(bar)
array(2) {
  ["foo"]=>
  int(123)
  ["bar"]=>
  string(3) "foo"
}

Objects:
object(stdClass)#1 (2) {
  ["foo"]=>
  int(123)
  ["bar"]=>
  string(3) "foo"
}
id(foo)
id(foo)
id(bar)
object(stdClass)#2 (2) {
  ["foo"]=>
  int(123)
  ["bar"]=>
  string(3) "foo"
}

Static props:
int(123)
string(3) "foo"
id(foo)
id(foo)
id(bar)
int(123)
string(3) "foo"