Почему var_dump не работает с объектами DomDocument, а print ($ dom-> saveHTML ())?

Почему var_dump не работает с объектами DomDocument , в то время как print($dom->saveHTML()) выводит результат?

Solutions Collecting From Web of "Почему var_dump не работает с объектами DomDocument, а print ($ dom-> saveHTML ())?"

Обновление: Начиная с PHP 5.4.1 вы можете, наконец, var_dump объекты DOM. См. https://gist.github.com/2499678


Это ошибка:

Он не имеет никакого отношения к каким-либо интерфейсам и на самом деле очень прост. var_dump показывает только те свойства класса, которые были объявлены их разработчиками, вызывая такие C-функции, как

 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(...) 

Например, свойства класса Exception объявлены в файле Zend / zend_exceptions.c следующим образом:

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

Затем все эти функции вызывают

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

который обновляет список свойств. Затем идет var_dump в ext/standard/var.c и просматривает их, вызывая php_object_property_dump который перечисляет их через один и тот же список свойств. Вы видите намеренно открытую внутреннюю структуру.

Разработчики расширения DOM просто решили не раскрывать структуру своих классов. Они просто не называют такие функции. Вот почему вы ничего не видите.

 object(DOMDocument)#1 (0) { } 

Если вы посмотрите на ext/dom/php_dom.c вы найдете объявление свойства один раз. И это для класса DomException. Он переопределяет code свойства.

 zend_declare_property_long(dom_domexception_class_entry, "code", ... 

Если свалка Exception выглядит

 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 } 

Дамп DOMException немного отличается.

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

Посмотрите, как переместилось свойство кода в конец? Это из-за переобучения.