php - variable - ¿Por qué var_dump no funciona con objetos DomDocument, mientras que print($ dom-> saveHTML()) sí?
var_export en php (2)
¿Por qué var_dump
no funciona con objetos DomDocument , mientras que print($dom->saveHTML())
produce resultados?
No tiene nada que ver con ninguna interfaz y, de hecho, es muy simple. var_dump muestra solo aquellas propiedades de clase que han sido declaradas por sus desarrolladores al llamar funciones C tales como
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(...)
Por ejemplo, las propiedades de la clase Excepción se declaran en el archivo Zend / zend_exceptions.c como este
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);
Todas estas funciones entonces llaman
ZEND_API int zend_declare_property_ex(zend_class_entry *ce, const char *name, ...
que actualiza la lista de propiedades. Luego viene var_dump
en ext/standard/var.c
y los busca llamando a php_object_property_dump
que los enumera a través de la misma lista de propiedades. Ves la estructura interna intencionalmente expuesta .
Los desarrolladores de la extensión DOM simplemente han optado por no exponer la estructura de sus clases. Simplemente no llaman a ese tipo de funciones. Es por eso que no ves nada.
object(DOMDocument)#1 (0) {
}
Si observa ext/dom/php_dom.c
, encontrará una declaración de propiedad una vez. Y es para la clase DomException. Se redefine el code
propiedad.
zend_declare_property_long(dom_domexception_class_entry, "code", ...
Si el volcado de excepción parece
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
}
El volcado DOMException es un poco diferente.
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)
}
¿Ves cómo la propiedad del código se movió al final? Es debido a la redeclaración.
Actualización: A partir de PHP 5.4.1, finalmente puede var_dump
objetos DOM. Ver https://gist.github.com/2499678
Es un error