Подтвердить что ты не робот

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

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

4b9b3361

Ответ 2

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

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