2011-01-23 7 views
18

Perché lo var_dump non funziona con gli oggetti DomDocument, mentre print($dom->saveHTML()) produce l'output?

risposta

9

Aggiornamento: A partire da PHP 5.4.1 è possibile infine oggetti DOM var_dump. Vedere https://gist.github.com/2499678


E 'un bug:

+0

Voglio sentire il tuo opinoin dell'aggiornamento della mia risposta. – akond

+0

@akond come ho detto nella mia risposta (prima della modifica), non sono bravo a leggere il codice C, ma probabilmente hai ragione con la spiegazione. Ho rimosso la mia ipotesi su Traversable. Comunque è ancora un insetto. – Gordon

6

Non ha nulla a che fare con le interfacce e infatti è molto semplice. var_dump mostra solo le proprietà della classe che sono stati dichiarati dai loro sviluppatori chiamando tali funzioni C come

ZEND_API int zend_declare_property(...) 
ZEND_API int zend_declare_property_null(...) 
ZEND_API int zend_declare_property_bool(...) 
ZEND_API int zend_declare_property_long(...) 
ZEND_API int zend_declare_property_double(...) 
ZEND_API int zend_declare_property_string(...) 
ZEND_API int zend_declare_property_stringl(...) 

Per esempio, le proprietà della classe Exception sono dichiarati nel file Zend/zend_exceptions.c come questo

zend_declare_property_string(default_exception_ce, "message", sizeof("message")-1, "", ZEND_ACC_PROTECTED TSRMLS_CC); 
    zend_declare_property_string(default_exception_ce, "string", sizeof("string")-1, "", ZEND_ACC_PRIVATE TSRMLS_CC); 
    zend_declare_property_long(default_exception_ce, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED TSRMLS_CC); 
    zend_declare_property_null(default_exception_ce, "file", sizeof("file")-1, ZEND_ACC_PROTECTED TSRMLS_CC); 
    zend_declare_property_null(default_exception_ce, "line", sizeof("line")-1, ZEND_ACC_PROTECTED TSRMLS_CC); 
    zend_declare_property_null(default_exception_ce, "trace", sizeof("trace")-1, ZEND_ACC_PRIVATE TSRMLS_CC); 
    zend_declare_property_null(default_exception_ce, "previous", sizeof("previous")-1, ZEND_ACC_PRIVATE TSRMLS_CC); 

Tutte queste funzioni quindi chiamare

ZEND_API int zend_declare_property_ex(zend_class_entry *ce, const char *name, ... 

whic h aggiorna la lista delle proprietà. Quindi viene il var_dump in ext/standard/var.c e li cerca chiamando php_object_property_dump che li enumera attraverso lo stesso elenco di proprietà. Vedete la struttura interna di intenzionalmente esposta.

Gli sviluppatori dell'estensione DOM solo hanno scelto di non esporre la struttura delle loro classi. Semplicemente non chiamano questo tipo di funzioni. Questo è il motivo per cui non vedi nulla.

object(DOMDocument)#1 (0) { 
} 

Se si guarda in ext/dom/php_dom.c a trovare una dichiarazione di proprietà una volta. Ed è per la classe DomException. Ridefinisce la proprietà code.

zend_declare_property_long(dom_domexception_class_entry, "code", ... 

Se il dump eccezione sembra

var_dump (new Exception ('test', 102)); 

object(Exception)#1 (7) { 
    ["message":protected]=> 
    string(4) "test" 
    ["string":"Exception":private]=> 
    string(0) "" 
    ["code":protected]=> 
    int(102) 
    ["file":protected]=> 
    string(37) "/usr/local/www/apache22/data/dump.php" 
    ["line":protected]=> 
    int(3) 
    ["trace":"Exception":private]=> 
    array(0) { 
    } 
    ["previous":"Exception":private]=> 
    NULL 
} 

La discarica DOMException è un po 'diverso.

var_dump (new DOMException()); 

object(DOMException)#2 (7) { 
    ["message":protected]=> 
    string(0) "" 
    ["string":"Exception":private]=> 
    string(0) "" 
    ["file":protected]=> 
    string(37) "/usr/local/www/apache22/data/dump.php" 
    ["line":protected]=> 
    int(9) 
    ["trace":"Exception":private]=> 
    array(0) { 
    } 
    ["previous":"Exception":private]=> 
    NULL 
    ["code"]=> 
    int(0) 
} 

Vedere come la proprietà del codice si è spostata verso la fine? È a causa della ridichiarazione.

+0

+1 per l'utilizzo della fonte. – alex

+0

E come aiuta? – Juergen

+0

@Juergen La domanda è stata "perché si comporta in questo modo?" non "come faccio X?" Quindi questo risponde alla domanda spiegando esattamente perché si comporta in questo modo. Ci sono molte domande "come faccio a ..." che potrebbero essere poste e avrebbero le loro risposte. – IMSoP

Problemi correlati