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