Почему 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) }
Посмотрите, как переместилось свойство кода в конец? Это из-за переобучения.