Handle this typehints
[hiphop-php.git] / hphp / test / slow / control-flow / bug-4976291.php
blob553108989b976c2a26a9091aed61c007361760c3
1 <?php
3 class E {}
5 class Dlgt extends E {
6 private $ent;
7 function __construct(E $e) {
8 $this->ent = $e;
12 class Dlgr {
13 function getDlgtObject($blah) {
14 return $blah ? new Dlgt($blah) : nullptr;
18 class X {
19 private static $classCache = array();
21 static function getuirc(E $blah) {
22 $blah_class = get_class($blah);
23 if (!array_key_exists($blah_class, self::$classCache)) {
24 $blah_uric = null;
25 for ($cls = $blah_class; $cls; $cls = get_parent_class($cls)) {
26 $blah_uric = $cls.'URILoader';
27 if (class_exists($blah_uric)) {
28 break;
32 if (is_subclass_of($blah_uric, Dlgr::class)) {
33 $d = $blah_uric::getDlgtObject($blah);
34 if ($d) {
35 $blah_class = get_class($d);
36 $blah_uric = self::getuirc($d);
40 self::$classCache[$blah_class] =
41 ($blah_uric !== __CLASS__ && class_exists($blah_uric)) ?
42 $blah_uric :
43 null;
45 return self::$classCache[$blah_class];
50 class D1 extends Dlgt {}
51 class D1URILoader {}
52 class F extends E {}
53 class FURILoader extends Dlgr {
54 function getDlgtObject($blah) {
55 return new D1($blah);
59 class D2 extends Dlgt {}
60 class D2URILoader {}
61 class G extends E {}
62 class GURILoader extends Dlgr {
63 function getDlgtObject($blah) {
64 return new D2($blah);
67 class H extends G {}
69 function main($x) {
70 X::getuirc($x);
73 for ($i=0; $i < 20; $i++) {
74 main(new F);
75 main(new H);
78 echo "Done\n";