3v4l.org

run code in 500+ PHP versions simultaneously
<?php /** * Dom\XMLDocument::C14N() drops namespace declarations on DOM-built documents * * When a Dom\XMLDocument is built via the DOM API (createElementNS, appendChild), * non-exclusive C14N() strips all namespace declarations while keeping prefixed * element names, producing invalid XML that cannot be re-parsed. * * This does NOT happen when: * - The document is parsed from a string (createFromString) * - Using legacy DOMDocument (DOM-built or parsed) * - Using exclusive C14N (C14N(exclusive: true)) * * Related: https://github.com/php/php-src/issues/20444 * Possibly related fix: https://github.com/php/php-src/commit/40c291cf932c31a302fa584bb50b6edb199fb07e * (but still broken on PHP 8.4.19) */ echo "PHP " . PHP_VERSION . PHP_EOL . PHP_EOL; // 1. DOM-built document: C14N drops namespace declarations $doc = Dom\XMLDocument::createEmpty(); $root = $doc->createElementNS("urn:envelope", "env:Root"); $doc->appendChild($root); $child = $doc->createElementNS("urn:child", "x:Child"); $root->appendChild($child); echo "DOM-built Dom\XMLDocument" . PHP_EOL; echo " saveXML: " . trim($doc->saveXML()) . PHP_EOL; echo " C14N: " . $doc->C14N() . PHP_EOL; // Expected: <env:Root xmlns:env="urn:envelope"><x:Child xmlns:x="urn:child"></x:Child></env:Root> // Actual: <env:Root><x:Child></x:Child></env:Root> // ^ namespace declarations are missing, this is not valid XML echo PHP_EOL; // 2. Same structure parsed from string: C14N works correctly $doc2 = Dom\XMLDocument::createFromString( '<env:Root xmlns:env="urn:envelope"><x:Child xmlns:x="urn:child"/></env:Root>' ); echo "Parsed Dom\XMLDocument" . PHP_EOL; echo " C14N: " . $doc2->C14N() . PHP_EOL; // Correct: <env:Root xmlns:env="urn:envelope"><x:Child xmlns:x="urn:child"></x:Child></env:Root> echo PHP_EOL; // 3. Legacy DOMDocument DOM-built: C14N works correctly $doc3 = new DOMDocument(); $root3 = $doc3->createElementNS("urn:envelope", "env:Root"); $doc3->appendChild($root3); $child3 = $doc3->createElementNS("urn:child", "x:Child"); $root3->appendChild($child3); echo "DOM-built DOMDocument (legacy)" . PHP_EOL; echo " C14N: " . $doc3->C14N() . PHP_EOL; // Correct: <env:Root xmlns:env="urn:envelope"><x:Child xmlns:x="urn:child"></x:Child></env:Root> echo PHP_EOL; // 4. Exclusive C14N on DOM-built document: works correctly echo "DOM-built Dom\XMLDocument (exclusive C14N)" . PHP_EOL; echo " C14N: " . $doc->C14N(exclusive: true) . PHP_EOL; // Correct: <env:Root xmlns:env="urn:envelope"><x:Child xmlns:x="urn:child"></x:Child></env:Root>
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/PGDSl
function name:  (null)
number of ops:  79
compiled vars:  !0 = $doc, !1 = $root, !2 = $child, !3 = $doc2, !4 = $doc3, !5 = $root3, !6 = $child3
line      #* E I O op                               fetch          ext  return  operands
-----------------------------------------------------------------------------------------
   21     0  E >   ECHO                                                         'PHP+8.5.0%0A%0A'
   24     1        INIT_STATIC_METHOD_CALL                                      'Dom%5CXMLDocument', 'createEmpty'
          2        DO_FCALL                                          0  $7      
          3        ASSIGN                                                       !0, $7
   25     4        INIT_METHOD_CALL                                             !0, 'createElementNS'
          5        SEND_VAL_EX                                                  'urn%3Aenvelope'
          6        SEND_VAL_EX                                                  'env%3ARoot'
          7        DO_FCALL                                          0  $9      
          8        ASSIGN                                                       !1, $9
   26     9        INIT_METHOD_CALL                                             !0, 'appendChild'
         10        SEND_VAR_EX                                                  !1
         11        DO_FCALL                                          0          
   27    12        INIT_METHOD_CALL                                             !0, 'createElementNS'
         13        SEND_VAL_EX                                                  'urn%3Achild'
         14        SEND_VAL_EX                                                  'x%3AChild'
         15        DO_FCALL                                          0  $12     
         16        ASSIGN                                                       !2, $12
   28    17        INIT_METHOD_CALL                                             !1, 'appendChild'
         18        SEND_VAR_EX                                                  !2
         19        DO_FCALL                                          0          
   30    20        ECHO                                                         'DOM-built+Dom%5CXMLDocument%0A'
   31    21        INIT_METHOD_CALL                                             !0, 'saveXML'
         22        DO_FCALL                                          0  $15     
         23        FRAMELESS_ICALL_1                trim                ~16     $15
         24        CONCAT                                               ~17     '++saveXML%3A+', ~16
         25        CONCAT                                               ~18     ~17, '%0A'
         26        ECHO                                                         ~18
   32    27        INIT_METHOD_CALL                                             !0, 'C14N'
         28        DO_FCALL                                          0  $19     
         29        CONCAT                                               ~20     '++C14N%3A++++', $19
         30        CONCAT                                               ~21     ~20, '%0A'
         31        ECHO                                                         ~21
   37    32        ECHO                                                         '%0A'
   40    33        INIT_STATIC_METHOD_CALL                                      'Dom%5CXMLDocument', 'createFromString'
   41    34        SEND_VAL                                                     '%3Cenv%3ARoot+xmlns%3Aenv%3D%22urn%3Aenvelope%22%3E%3Cx%3AChild+xmlns%3Ax%3D%22urn%3Achild%22%2F%3E%3C%2Fenv%3ARoot%3E'
   40    35        DO_FCALL                                          0  $22     
         36        ASSIGN                                                       !3, $22
   43    37        ECHO                                                         'Parsed+Dom%5CXMLDocument%0A'
   44    38        INIT_METHOD_CALL                                             !3, 'C14N'
         39        DO_FCALL                                          0  $24     
         40        CONCAT                                               ~25     '++C14N%3A++++', $24
         41        CONCAT                                               ~26     ~25, '%0A'
         42        ECHO                                                         ~26
   47    43        ECHO                                                         '%0A'
   50    44        NEW                                                  $27     'DOMDocument'
         45        DO_FCALL                                          0          
         46        ASSIGN                                                       !4, $27
   51    47        INIT_METHOD_CALL                                             !4, 'createElementNS'
         48        SEND_VAL_EX                                                  'urn%3Aenvelope'
         49        SEND_VAL_EX                                                  'env%3ARoot'
         50        DO_FCALL                                          0  $30     
         51        ASSIGN                                                       !5, $30
   52    52        INIT_METHOD_CALL                                             !4, 'appendChild'
         53        SEND_VAR_EX                                                  !5
         54        DO_FCALL                                          0          
   53    55        INIT_METHOD_CALL                                             !4, 'createElementNS'
         56        SEND_VAL_EX                                                  'urn%3Achild'
         57        SEND_VAL_EX                                                  'x%3AChild'
         58        DO_FCALL                                          0  $33     
         59        ASSIGN                                                       !6, $33
   54    60        INIT_METHOD_CALL                                             !5, 'appendChild'
         61        SEND_VAR_EX                                                  !6
         62        DO_FCALL                                          0          
   55    63        ECHO                                                         'DOM-built+DOMDocument+%28legacy%29%0A'
   56    64        INIT_METHOD_CALL                                             !4, 'C14N'
         65        DO_FCALL                                          0  $36     
         66        CONCAT                                               ~37     '++C14N%3A++++', $36
         67        CONCAT                                               ~38     ~37, '%0A'
         68        ECHO                                                         ~38
   59    69        ECHO                                                         '%0A'
   62    70        ECHO                                                         'DOM-built+Dom%5CXMLDocument+%28exclusive+C14N%29%0A'
   63    71        INIT_METHOD_CALL                                             !0, 'C14N'
         72        SEND_VAL_EX                                                  <true>, 'exclusive'
         73        CHECK_UNDEF_ARGS                                             
         74        DO_FCALL                                          1  $39     
         75        CONCAT                                               ~40     '++C14N%3A++++', $39
         76        CONCAT                                               ~41     ~40, '%0A'
         77        ECHO                                                         ~41
   64    78      > RETURN                                                       1

Generated using Vulcan Logic Dumper, using php 8.5.0


preferences:
141.04 ms | 1336 KiB | 15 Q