我有一个 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/