¿Por qué no var_dump funciona con objetos DomDocument, mientras que print ($ dom-> saveHTML ()) lo hace?

¿Por qué no var_dump funciona con objetos DomDocument , mientras que print($dom->saveHTML()) produce resultados?

Actualización: a partir de PHP 5.4.1 puedes finalmente var_dump objetos DOM. Ver https://gist.github.com/2499678


Es un error:

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 llamando a tales funciones C 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 Exception 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 luego llaman

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

que actualiza la lista de propiedades. Luego viene el 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 expuesta intencionalmente .

Los desarrolladores de la extensión DOM simplemente han elegido no exponer la estructura de sus clases. Simplemente no llaman ese tipo de funciones. Es por eso que no ves nada.

 object(DOMDocument)#1 (0) { } 

Si miras en ext/dom/php_dom.c , encuentras una statement 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 se ve como

 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 de la excepción 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) } 

Vea cómo la propiedad del código se movió hasta el final? Es por restatement.