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

为什么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); 

所有这些function然后调用

 ZEND_API int zend_declare_property_ex(zend_class_entry *ce, const char *name, ... 

其中更新属性列表。 接下来是ext/standard/var.cvar_dump ,并通过调用php_object_property_dump来查找它们, php_object_property_dump通过相同的属性列表枚举它们。 你看到有意暴露的内部结构。

DOM扩展的开发者只是select不暴露他们类的结构。 他们根本不称这些function。 这就是为什么你什么也看不到

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

看看代码属性如何移动到最后? 这是因为重新宣布。