Perché lo var_dump
non funziona con gli oggetti DomDocument, mentre print($dom->saveHTML())
produce l'output?
risposta
Aggiornamento: A partire da PHP 5.4.1 è possibile infine oggetti DOM var_dump
. Vedere https://gist.github.com/2499678
E 'un bug:
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.
+1 per l'utilizzo della fonte. – alex
E come aiuta? – Juergen
@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
- 1. Xdebug non funziona con var_dump()
- 2. perché il confronto Javascript non funziona con gli oggetti?
- 3. Come ottenere tutti gli elemets con var_dump?
- 4. NullReferenceException mentre gli oggetti coinvolti sono validi
- 5. Perché var_dump non mostra byte null?
- 6. Perché ConfigureAwait (false) non funziona mentre Task.Run() funziona?
- 7. Come posso rimuovere tutti gli elementi figlio dell'elemento body con DOMDocument?
- 8. Come "==" funziona per gli oggetti?
- 9. CDI con gli oggetti non gestiti
- 10. Stampa oggetti tabella con ggplot?
- 11. richieste JSON ritorno con gli oggetti che non ordinate
- 12. php DomDocument aggiunge tag extra
- 13. Perché @JsonUnwrapped non funziona per gli elenchi?
- 14. Perché does .join() non funziona con gli argomenti delle funzioni?
- 15. Test unità di Visual Studio: perché il test non funziona mentre analizza gli stessi valori float?
- 16. Int64 non funziona mentre Int funziona
- 17. Perché StringBuilder non stampa?
- 18. Perché la serializzazione JSON degli oggetti datetime in python non funziona fuori dagli schemi per gli oggetti datetime
- 19. Perché la stampa non funziona in un lambda?
- 20. PHP DOMDocument - ottenere sorgente html di BODY
- 21. PHP con DOMDocument
- 22. Disabilita codifica entità HTML in PHP DOMDocument
- 23. Stampa di oggetti in Django
- 24. directory.GetFiles, come faccio a sputare gli oggetti mentre li trova?
- 25. Perché la scrittura nell'oggetto temporaneo del flusso di stringhe stampa solo gli indirizzi degli oggetti?
- 26. Perché Radium non funziona con Reagent (Clojurescript)?
- 27. Xcode 5 debugger non oggetti di stampa
- 28. PHP HTML DomDocument getElementById problemi
- 29. Perché console.log() non stampa nulla?
- 30. Aiuto parsing XML con DOMDocument
Voglio sentire il tuo opinoin dell'aggiornamento della mia risposta. – akond
@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