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