Почему var_dump не работает с объектами DomDocument, а print ($ dom-> saveHTML ()) работает? - PullRequest
18 голосов
/ 23 января 2011

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

Ответы [ 2 ]

9 голосов
/ 23 января 2011

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


Это ошибка:

6 голосов
/ 23 января 2011

Это не имеет никакого отношения к любым интерфейсам и на самом деле очень просто.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)
}

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

...