1--TEST-- 2Static return type 3--FILE-- 4<?php 5 6class A { 7 public function test1(): static { 8 return new static; 9 } 10 public function test2(): static { 11 return new self; 12 } 13 public function test3(): static { 14 return new static; 15 } 16 public function test4(): static|array { 17 return new self; 18 } 19} 20 21class B extends A { 22 public function test3(): static { 23 return new C; 24 } 25} 26 27class C extends B {} 28 29$a = new A; 30$b = new B; 31 32var_dump($a->test1()); 33var_dump($b->test1()); 34 35echo "\n"; 36var_dump($a->test2()); 37try { 38 var_dump($b->test2()); 39} catch (TypeError $e) { 40 echo $e->getMessage(), "\n"; 41} 42 43echo "\n"; 44var_dump($a->test3()); 45var_dump($b->test3()); 46 47echo "\n"; 48var_dump($a->test4()); 49try { 50 var_dump($b->test4()); 51} catch (TypeError $e) { 52 echo $e->getMessage(), "\n"; 53} 54 55echo "\n"; 56$test = function($x): static { 57 return $x; 58}; 59 60try { 61 var_dump($test(new stdClass)); 62} catch (TypeError $e) { 63 echo $e->getMessage(), "\n"; 64} 65 66$test = $test->bindTo($a); 67var_dump($test($a)); 68 69?> 70--EXPECT-- 71object(A)#3 (0) { 72} 73object(B)#3 (0) { 74} 75 76object(A)#3 (0) { 77} 78A::test2(): Return value must be of type B, A returned 79 80object(A)#3 (0) { 81} 82object(C)#3 (0) { 83} 84 85object(A)#3 (0) { 86} 87A::test4(): Return value must be of type B|array, A returned 88 89{closure}(): Return value must be of type static, stdClass returned 90object(A)#1 (0) { 91} 92