1<?php
2
3// Requires X, delay to runtime.
4// TODO: It is not actually required, because we don't need X to check inheritance in this case.
5class A extends Z {
6    public function method(X $a) {}
7}
8class B extends Z {
9    public function method($a) : X {}
10}
11
12// Works.
13class C extends Z {
14    public function method($a): self {}
15    public function method2($a): C {}
16}
17class D extends C {
18    public function method($a): self {}
19    public function method2($a): D {}
20}
21
22// Works.
23interface I {}
24interface J extends I {}
25class E {
26    public function method($a): I {}
27}
28class F extends E {
29    public function method($a): J {}
30}
31
32// Requires K & L, delay to runtime.
33class G {
34    public function method($a): K {}
35}
36class H extends G {
37    public function method($a): L {}
38}
39
40// Early-binding preventer.
41class Z {
42    public function method(X $a) {}
43}
44