为什么var_dump不能与DomDocument对象一起使用,而print($ dom-> saveHTML())呢?

Yos*_*sef 18 php domdocument

为什么不能var_dump使用DomDocument对象,同时print($dom->saveHTML())产生输出?

Gor*_*don 9

更新:从PHP 5.4.1开始,您最终可以使用var_dumpDOM对象.请参阅https://gist.github.com/2499678


这是一个错误:


ako*_*ond 6

它与任何接口无关,实际上非常简单.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(...)
Run Code Online (Sandbox Code Playgroud)

例如,类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);
Run Code Online (Sandbox Code Playgroud)

所有这些功能然后调用

ZEND_API int zend_declare_property_ex(zend_class_entry *ce, const char *name, ...
Run Code Online (Sandbox Code Playgroud)

它会更新属性列表.然后是var_dumpext/standard/var.c,并通过调用看起来起来php_object_property_dump它枚举它们通过相同的属性列表.你看到有意暴露的内部结构.

DOM扩展的开发人员只是选择不公开其类的结构.他们根本就不会调用那些函数.这就是你什么也看不见的原因.

object(DOMDocument)#1 (0) {
}
Run Code Online (Sandbox Code Playgroud)

如果你看一下ext/dom/php_dom.c你找到一个属性声明.它适用于DomException类.它重新定义了财产code.

zend_declare_property_long(dom_domexception_class_entry, "code", ...
Run Code Online (Sandbox Code Playgroud)

如果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
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

看看代码属性如何移动到最后?这是因为重新声明.