1--TEST-- 2Union of two intersection type 3--FILE-- 4<?php 5 6interface W {} 7interface X {} 8interface Y {} 9interface Z {} 10 11class A implements X, Y {} 12class B implements W, Z {} 13class C {} 14 15function foo1((X&Y)|(W&Z) $v): (X&Y)|(W&Z) { 16 return $v; 17} 18function foo2((W&Z)|(X&Y) $v): (W&Z)|(X&Y) { 19 return $v; 20} 21 22function bar1(): (X&Y)|(W&Z) { 23 return new C(); 24} 25function bar2(): (W&Z)|(X&Y) { 26 return new C(); 27} 28 29$a = new A(); 30$b = new B(); 31 32$o = foo1($a); 33var_dump($o); 34$o = foo2($a); 35var_dump($o); 36$o = foo1($b); 37var_dump($o); 38$o = foo2($b); 39var_dump($o); 40 41try { 42 bar1(); 43} catch (\TypeError $e) { 44 echo $e->getMessage(), \PHP_EOL; 45} 46try { 47 bar2(); 48} catch (\TypeError $e) { 49 echo $e->getMessage(), \PHP_EOL; 50} 51 52?> 53--EXPECTF-- 54object(A)#%d (0) { 55} 56object(A)#%d (0) { 57} 58object(B)#%d (0) { 59} 60object(B)#%d (0) { 61} 62bar1(): Return value must be of type (X&Y)|(W&Z), C returned 63bar2(): Return value must be of type (W&Z)|(X&Y), C returned 64