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
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