2009-10-26 92 views
5

爆炸COM對象進行調試的正確方法是什麼?我有一個返回多級對象的第三方函數。這些文檔是不存在的,所以我希望能夠將所有東西都回顯出來,或者在Komodo IDE中進行調試。探索PHP中的COM對象

科莫多隻是說對象,沒有別的。也許轉換爲數組?

我知道現有的一些選項,如$com->Status,但也有更多的變量返回的我想知道它們是什麼。

+1

什麼的var_dump()/的print_r()說什麼? – 2009-10-26 16:16:53

+1

'print_r($ data)'返回'variant Object'。出於某種原因,'var_dump'崩潰了php。 – shaiss 2009-10-26 16:33:14

回答

0

很奇怪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)); 
?> 

希望這有助於。

+0

reflection returns'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));'返回函數未找到 – shaiss 2009-10-26 19:05:37

+0

錯字使用:get_object_vars而不是:get_objcet_vars – elviejo79 2009-10-26 19:18:58

+0

沒有運氣。感謝信息 – shaiss 2009-10-26 21:44:26

7

您可以使用com_print_typeinfo()代替的var_dump()。 這應該適用於COM,VARIANT和DOTNET對象。輸出類似於此:

 
class IFile { /* GUID={C7C3F5A4-88A3-11D0-ABCB-00A0C90FFFC0} */ 

// some PHP-COM internal stuff ... 

/* DISPID=1610612736 */ 
function QueryInterface(
    /* VT_PTR [26] [in] --> ? [29] */ &$riid, 
    /* VT_PTR [26] [out] --> VT_PTR [26] */ &$ppvObj 
) 
{ 
} 
/* DISPID=1610612737 */ 
/* VT_UI4 [19] */ 
function AddRef(
) 
{ 
} 

// ... 
/* DISPID=1610678275 */ 
function Invoke(
    /* 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 
) 
{ 
} 

// properties and methods of the COM object 
// ... 

/* DISPID=1001 */ 
/* VT_BSTR [8] */ 
/* Short name */ 
var $ShortName; 

/* DISPID=1004 */ 
/* VT_PTR [26] */ 
/* Get drive that contains file */ 
var $Drive; 

/* DISPID=1005 */ 
/* VT_PTR [26] */ 
/* Get folder that contains file */ 
var $ParentFolder; 


// ... 

/* DISPID=1204 */ 
function Move(
    /* VT_BSTR [8] [in] */ $Destination 
) 
{ 
    /* Move this file */ 
} 
/* DISPID=1100 */ 
/* VT_PTR [26] */ 
function OpenAsTextStream(
    /* ? [29] [in] */ $IOMode, 
    /* ? [29] [in] */ $Format 
) 
{ 
    /* Open a file as a TextStream */ 
} 
} 
+0

這有點晚。但是當我很快修改這個項目時,我會仔細檢查一下。 – shaiss 2010-06-14 20:05:15

+0

小心! 'com_print_typeinfo'可以讓你的Apache錯誤檢查! – 2013-10-18 02:29:26

0

天然var_dump()不會崩潰的COM對象。

擴展xdebug,取代了原生var_debug()函數和不支持COM對象。

解決方法是通過將xdebug.overload_var_dump = off添加到php.ini來禁用xdebug的函數var_dump()的重寫。

,相關的bug xdebug bug tracker