【问题标题】:Need C++ constructor/destructor on stack in PHP在 PHP 的堆栈上需要 C++ 构造函数/析构函数
【发布时间】:2012-01-10 08:08:13
【问题描述】:

在我有很多退出点的函数中,我想在进入时锁定表,但在退出该函数时自动解锁所有表,无论是异常、返回等。

在 C++ 中,我会在类构造函数中创建锁定表并在析构函数中解锁表,并在堆栈上的函数入口处创建类,该类将在函数退出时自动展开(破坏)。

所以在 C++ 中:

struct locktables{

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

};


void process_function()
{
locktables _l_dddsdsdsa;

//logic goes here


}

我知道这些类是作为引用而不是在堆栈上创建的。

如何在 PHP 中做到这一点?

【问题讨论】:

  • 您可以在 PHP 中使用带有 con/destructors 的对象来模拟相同的效果,但也许以一种一开始就不需要锁定的方式来构建应用程序是一个更好的选择?或者,如果您要锁定,只需以确保所有表在脚本末尾解锁的方式进行函数调用顺序?
  • 但是保证类析构函数会在 PHP 中的函数退出后立即被调用,就像堆栈变量在堆栈展开时立即被销毁一样。我正在研究 Drupal CMS,它本身使用许多其他表。如果我没有在函数退出时解锁我的表,那么我会收到错误,因为 Drupal 也将使用其他一些表。
  • @Aga:不,不能保证。至少在脚本结束时会调用析构函数,否则当垃圾收集开始时。所以这取决于你的脚本运行多长时间以及你想要锁定多少。
  • function process_function2(){ /*lock all*/process_function(); /*unlock all*/} 看起来这会做同样的事情。

标签: php locking


【解决方案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()
{
    //...
}

【讨论】:

  • 否..但是 return 语句将跳过 catch 块和后续行。
  • 这就是为什么它在doFooWithLock()的最后一行。
猜你喜欢
  • 2013-04-14
  • 2013-04-29
  • 2011-12-13
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2011-04-03
相关资源
最近更新 更多