php - 您如何创建一个包含环绕常用代码的代码块的函数?

标签 php mysql design-patterns transactions

我有一个 do...while 循环和一个 try...catch block ,它们环绕着以数据库为中心的代码。 do...while 和 try...catch 的目的是防止事务死锁,经过广泛的测试后效果非常好。我现在的问题是代码冗余。我想不出一种方法来部署执行 do...while 和 try...catch 的函数或方法,而不使用“邪恶的”eval 命令来绕过一组通用的以数据库为中心的代码。我想这会出现在其他软件设计模式场景下。

这说明了我如何想象使用 eval 的方法:

class Database {
    public static function deadlockSafeTransaction($code) {
        do {
            // setup a condition
            try {
                // start transaction

                eval($code); //evil

                // commit transaction
            }
            catch(Exception $ex) {
                // rollback transaction
                // analyze exception for deadlock and adjust condition or rethrow exception
            }
        } while(condition);
    }
}

如果我使用上述方法,这说明了一种不受欢迎的编码做法:

// code

Database::deadlockSafeTransaction("
// code - sometimes a lot of complicated code with other method calls and loops
");

// code

我正在寻找不包括使用 eval 命令的解决方案。

写完所有这些之后,我想到了在我的代码两侧添加 include 语句的可能性:

include "do-try.php";
// database code
include "catch-while.php";

但我正在寻找更 OOPish 和更少 hackish 的东西。我什至不知道以上是否可行,并且包含可能会带来不必要的性能开销。因此,该问题仍值得探讨和讨论以寻求最佳解决方案。

最佳答案

你可以传入一个匿名函数:

$myFunction = function() {
  // do something
};

Database::deadlockSafeTransaction($myFunction);

调用 deadlockSafeTransaction 代码中的函数:

public static function deadlockSafeTransaction($myFunction) {
    ...
    $return = $myFunction();
    ...
}

更多信息是available in the PHP docs .如果您使用的是 < 5.3.x 的 PHP,您还可以使用 call_user_func方法。

关于php - 您如何创建一个包含环绕常用代码的代码块的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651195/

相关文章:

php - 生成组合数组 PHP

php - 验证 endIndex 处不带斜线的 url

php - 如何在 URL 中传递斜杠/?

PHP/MySQL - 选择 IN

C++:类功能子集的推荐设计模式?

java - 继承与否

php - 静态变量 PHP 的问题

PHP变量声明

mysql - 如何在使用CASE时不使用MAX

c# - 在 switch 语句中,有什么方法可以引用被切换的值吗?