-
Notifications
You must be signed in to change notification settings - Fork 8k
Expand file tree
/
Copy pathinvokable_callable_covariance.phpt
More file actions
65 lines (56 loc) · 1.24 KB
/
invokable_callable_covariance.phpt
File metadata and controls
65 lines (56 loc) · 1.24 KB
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
--TEST--
Invokable is covariant to callable in return types
--FILE--
<?php
class Base {
public function getHandler(): callable {
return fn() => 1;
}
}
/* Invokable is a valid covariant return type for callable */
class Child extends Base {
public function getHandler(): Invokable {
return new class {
public function __invoke(): int {
return 2;
}
};
}
}
$c = new Child();
$handler = $c->getHandler();
var_dump($handler instanceof Invokable);
var_dump($handler());
/* Concrete class with __invoke is also covariant to callable */
class Handler {
public function __invoke(): int {
return 3;
}
}
class Child2 extends Base {
public function getHandler(): Handler {
return new Handler();
}
}
$c2 = new Child2();
$handler2 = $c2->getHandler();
var_dump($handler2 instanceof Invokable);
var_dump($handler2());
/* Closure is covariant to callable via Invokable */
class Child3 extends Base {
public function getHandler(): Closure {
return fn() => 4;
}
}
$c3 = new Child3();
$handler3 = $c3->getHandler();
var_dump($handler3 instanceof Invokable);
var_dump($handler3());
?>
--EXPECT--
bool(true)
int(2)
bool(true)
int(3)
bool(true)
int(4)