2012-01-10 50 views
0

析構函數在我的函數,它有很多的出口點,我要鎖定入境表,但在這個函數退出時自動解鎖所有表是否例外,返回等需要C++構造函數/堆棧在PHP

在C++我會在類構造函數中創建鎖表,並在析構函數中解鎖表,並簡單地在函數入口上創建類,該函數將在函數退出時自動展開(破壞)。

所以在C++:

struct locktables{ 

locktables() 
{ 
//lock them all 
} 
~locktables() 
{ 
//unlock them all 
} 

}; 


void process_function() 
{ 
locktables _l_dddsdsdsa; 

//logic goes here 


} 

我知道類是作爲參考,而不是在棧上創建。

如何在PHP中執行此操作?

+1

您可以在PHP中使用con/destructors使用對象來模擬相同的內容,但是可能是以不需要鎖定的方式構建應用程序的更好選擇?或者,如果您正在鎖定,只需以確保所有表在腳本結尾解鎖的方式進行函數調用順序? – deceze 2012-01-10 08:13:18

+0

但是,保證類函數在PHP中退出後立即調用類析構函數,就像在堆棧展開時立即銷燬堆棧變量一樣。我正在使用Drupal CMS,它本身使用許多其他表格。如果我不在函數退出時解鎖我的表格,那麼我得到錯誤,因爲Drupal也會使用其他表格。 – AgA 2012-01-10 08:17:06

+0

@Aga:不,不能保證。至少在腳本末尾會調用析構函數,否則當垃圾回收開始運行時,所以這取決於腳本運行多久以及要鎖定多少。 – hakre 2012-01-10 08:18:27

回答

1

爲什麼不封裝函數調用?

function doFooWithLock() 
{ 
    lock(); 
    try 
    { 
     $return = doFoo(); 
    } 
    catch(Exception $e) 
    { 
     // no idea for what you need to catch. 
     unlock(); 
     throw $e; # re-throw 
    } 
    unlock(); 
    return $return; 
} 

function doFoo() 
{ 
    //... 
} 
+0

否..但是return語句將跳過catch塊和後續行。 – AgA 2012-01-10 08:26:06

+1

這就是爲什麼它在'doFooWithLock()'的最後一行。 – hakre 2012-01-10 08:31:52