ver variable var_export var_dump print entre ejemplos diferencias completo array php domdocument

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.