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

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

2 ответа

Решение

Обновление: Начиная с 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", ...

Если дамп исключения выглядит

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

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

Другие вопросы по тегам