【问题标题】:Explore a COM Object in PHP探索 PHP 中的 COM 对象
【发布时间】:2010-12-10 04:29:46
【问题描述】:

分解 COM 对象以进行调试的正确方法是什么?我有一个返回多级对象的第 3 方函数。该文档不存在,因此我希望能够从对象中回显所有内容或在 Komodo IDE 中对其进行调试。

Komodo 只说对象,没有别的。也许转换为数组?

我知道一些现有的选项,例如$com->Status,但还有更多的变量返回,我想知道它们是什么。

【问题讨论】:

  • var_dump() / print_r() 说什么?
  • print_r($data) 返回variant Objectvar_dump 由于某种原因导致 php 崩溃。

标签: php com object explode komodo


【解决方案1】:

您可以使用com_print_typeinfo() 代替 var_dump()。 这应该适用于 COM、VARIANT 和 DOTNET 对象。输出类似于:

类 IFile { /* GUID={C7C3F5A4-88A3-11D0-ABCB-00A0C90FFFC0} */ // 一些 PHP-COM 内部的东西 ... /* 分配=1610612736 */ 函数查询接口( /* VT_PTR [26] [in] --> ? [29] */ &$riid, /* VT_PTR [26] [out] --> VT_PTR [26] */ &$ppvObj ) { } /* 分配=1610612737 */ /* VT_UI4 [19] */ 函数添加引用( ) { } // ... /* 分配=1610678275 */ 函数调用( /* VT_I4 [3] [in] */ $dispidMember, /* VT_PTR [26] [in] --> ? [29] */ &$riid, /* VT_UI4 [19] [in] */ $lcid, /* VT_UI2 [18] [in] */ $wFlags, /* VT_PTR [26] [in] --> ? [29] */ &$pdispparams, /* VT_PTR [26] [out] --> VT_VARIANT [12] */ &$pvarResult, /* VT_PTR [26] [out] --> ? [29] */ &$pexcepinfo, /* VT_PTR [26] [out] --> VT_UINT [23] */ &$puArgErr ) { } // COM 对象的属性和方法 // ... /* 分配=1001 */ /* VT_BSTR [8] */ /* 简称 */ 变种$短名称; /* 分配=1004 */ /* VT_PTR [26] */ /* 获取包含文件的驱动器 */ 变量$驱动器; /* 分配=1005 */ /* VT_PTR [26] */ /* 获取包含文件的文件夹 */ var $父文件夹; // ... /* 分配=1204 */ 函数移动( /* VT_BSTR [8] [in] */ $Destination ) { /* 移动这个文件 */ } /* 分配=1100 */ /* VT_PTR [26] */ 函数 OpenAsTextStream( /* ? [29] [输入] */ $IOMode, /* ? [29] [输入] */ $格式 ) { /* 以 TextStream 形式打开文件 */ } }

【讨论】:

  • 这有点晚了。但是当我很快修改这个项目时,我会仔细检查一下。
  • 小心! com_print_typeinfo 可以让你的 Apache 错误检查!
【解决方案2】:

奇怪的是 var_dump 不起作用。

但你可以尝试使用其他的 php 反射工具。

Reflection Class:

<?php
Reflection::export(new ReflectionClass(get_class($data)));
?>

或者你可以试试get_class_methods:

<?php
  print_r(get_class_methods($data));
?>

get_object_vars 查看其字段:

<?php
  print_r(get_object_vars($data));
?>

希望这会有所帮助。

【讨论】:

  • 反射返回Class [ class variant ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } }print_r(get_class_methods($data)); 返回Array()print_r(get_objcet_vars($data)); 返回函数未找到
  • 错字使用:get_object_vars 而不是:get_objcet_vars
【解决方案3】:

本机 var_dump() 不会因 COM 对象而崩溃。

扩展xdebug,替代原生的var_debug()函数,不支持COM对象。

解决方案是通过将 xdebug.overload_var_dump=off 添加到 php.ini 来停用 xdebug 对函数 var_dump() 的覆盖。

xdebug bug tracker中的相关bug

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 2012-10-20
    • 2017-07-17
    • 1970-01-01
    • 2012-04-16
    • 2016-12-19
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多