在重构的PHP代码中停止执行?

时间:2011-01-22 23:11:17

标签: php oop testing refactoring

我刚刚重构了一个php页面,以便将来稍微更容易扩展和维护,并且陷入了一个非常简单的问题。

我已将一种方法分解为3。

largemethod()已经变成这样:

nowsmallmethod(){
  doSomeChecks();
  assignProduct();
  giveFeedbacktoUser();
}

这一切都很好,我遇到的问题是doSomeChecks();

doSomeChecks(){
 if(something that shouldnt be true is true){
    return Controller->redirectBk();
 }
}

问题的症结在于,当nowsmallmethod()完成时,Controller-redirectBk首先重定向。这意味着即使测试失败,也会为用户分配产品。我正在使用一个名为Silverstripe的php框架,因此我无法真正改变Controller-> redirectBk()的行为。如果我没有用他们自己的方法进行检查,那么一切都会正常工作,因为“return Controller-> redirectBk();”会停止执行并重定向回来。 当测试失败时,什么是在nowsmallmethod()中停止执行的最佳方法?我意识到我可以返回错误的状态代码,然后停止执行,但这似乎是一种丑陋的方式。有没有更优雅的方式?另一种选择是如果我可以在doSomeChecks()中返回这样的东西,“返回(返回$ controller-> redirectBk())”但这不是有效的PHP语法,也不是特别容易阅读。任何帮助都将非常感激。

享受你的周末! 干杯 尼克

2 个答案:

答案 0 :(得分:1)

nowsmallmethod() {
  if (doSomeChecks()) {
    assignProduct();
    giveFeedbacktoUser();
  }
}

doSomeChecks根据重定向是否会发生,返回true或false。

或者,您可以diethrow,但我认为正常情况更适合您的情况。

答案 1 :(得分:1)

使用例外来处理这样的情况:

<?php
try {
    // some code
    if (!$check) {
         throw new Exception('Check has failed!');
    }
    // code after 'throw' will not be executed
} 
catch(Exception $e) {
    //this is executed when exception is caught
}
?>

如果在child方法中抛出异常,则堆栈将回滚到第一个try / catch块。详细了解例外情况:http://php.net/manual/en/language.exceptions.php

此外,您可以将异常与事务机制结合起来以处理数据库完整性。