1--TEST--
2libxml_set_external_entity_loader() trampoline callback
3--EXTENSIONS--
4dom
5--FILE--
6<?php
7$xml = <<<XML
8<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar">
9<foo>bar</foo>
10XML;
11
12class TrampolineTest {
13    const DTD = '<!ELEMENT foo (#PCDATA)>';
14
15    public function __call(string $name, array $arguments) {
16        echo 'Trampoline for ', $name, PHP_EOL;
17        var_dump($arguments);
18        $f = fopen("php://temp", "r+");
19        fwrite($f, self::DTD);
20        rewind($f);
21        return $f;
22    }
23}
24$o = new TrampolineTest();
25$callback = [$o, 'entity_loader'];
26
27libxml_set_external_entity_loader($callback);
28
29$dd = new DOMDocument;
30$r = $dd->loadXML($xml);
31var_dump($dd->validate());
32
33echo "Done.\n";
34
35?>
36--EXPECT--
37Trampoline for entity_loader
38array(3) {
39  [0]=>
40  string(10) "-//FOO/BAR"
41  [1]=>
42  string(25) "http://example.com/foobar"
43  [2]=>
44  array(4) {
45    ["directory"]=>
46    NULL
47    ["intSubName"]=>
48    NULL
49    ["extSubURI"]=>
50    NULL
51    ["extSubSystem"]=>
52    NULL
53  }
54}
55bool(true)
56Done.
57