【问题标题】:Is it good practice to die or exit in long scripts (PHP)在长脚本中死亡或退出是一种好习惯(PHP)
【发布时间】:2018-11-20 21:30:57
【问题描述】:

我查看了不同的答案,除了这个谈论 die while testing and generating errors 的答案之外,我想知道 die() 在继续执行无用时是否会对我的代码产生负面影响。

例如,如果我有一个包含许多条件的长脚本,那么在给定点,一旦我正在寻找的条件成功,我就不需要我的脚本继续测试其他条件。

$a = 'a';

if($a == 'a'){
 //long script
 die();
}

if($b == 'a'){
 //long script
 die();
}

if($c == 'a'){
 //long script
 die();
}

这是一个简单且可能很愚蠢的示例,还有其他更优雅的解决方案,但它有助于解释我的问题;如果我在第一个条件下die(),它将停止执行其余代码,理论上,这应该优化性能,或者可能不会......

让脚本结束更好还是die()实际上会加快进程?如果die() 有负面影响,当然还有其他方法可以绕过它,比如创建标志让脚本跳过某些代码块,我只想知道die() 的负面影响如果有的话。

例如: - 在内存方面,die() 会继续使用内存还是释放更多内存。 - 就时间/执行而言,die() 会加快进程,因为它不会尝试执行脚本的其余部分,或者根本没有区别。想象一下,在代码中可能有一个可以避免的繁重过程。

我想明确这一点,我知道必须有许多其他方法来提高效率,更短的脚本、开关、标志等。我只是想了解使用die() 是否有任何负面影响。

谢谢

【问题讨论】:

  • 我都不喜欢。exit 是更喜欢的,但通常在基于控制器的环境(MVC,MVVM)中你会return
  • 我猜是口味问题。我通常会抛出一个异常,将其捕获到更高的位置,然后记录该异常。脚本到此结束。但这仅在您想稍后检查它们时才有用,如果您不在乎,还不如退出(或死亡)。
  • 退出真的比死机更受欢迎吗?我从die 手册页看到的只有die — Equivalent to exit 看看你用 die 保存的所有字节!
  • 这个问题不是基于意见的,不应该被搁置。
  • “我只是想了解使用 die() 是否有任何负面影响” - 不……好吧,除非你可能患有死亡恐惧症。我只会在测试环境中使用其中任何一个进行调试。

标签: php exit die


【解决方案1】:

使用 die/exit 是代码设计不佳的标志,它最终会导致代码错误。从这个意义上说,它会产生负面影响。当exit运行时,它在调用shutdown函数后终止脚本执行(如果shutdown 回调函数已注册)。如果与 0(零)一起使用,则 die/exit 唯一一次会产生正输出,这会成功终止脚本执行。所有其他事件都指向错误。结果,没有必要使用exit。

坦率地说,我应该补充一点,如果答案是使用 exit/die,那么要么问题是错误的,要么脚本写得不好。在您的示例中,如果脚本需要根据值运行,则代码应类似于:

abstract class AbstractProcess {
  abstract public function run();
}

class A extends AbstractProcess {
  public function run() { echo 'A'; }
}

class B extends AbstractProcess {
  public function run() { echo 'B'; }
}

class C extends AbstractProcess {
  public function run() { echo 'C'; }
}

class ProcessException extends \Exception { }

class Processor
{
  private $handlers = [];

  public function addProcess($key, AbstractProcess $process) 
  {
    $this->handlers[$key] = $process;
  }

  public function run($val)
  {
    if ( !isset($this->handlers[$val]) )
    {
      throw new ProcessException('Cannot process value: ' .  $val);
    }
    return $this->handlers[$val]->run();
  }
}

这可以更复杂。那不是重点。它归结为有一个好的异常处理策略。您可以在网上找到数以百计的关于异常以及如何实现异常处理的资源。大多数现代框架都内置了这个——你所需要的只是引入你的异常处理逻辑。我们在 try/catch 块中运行上面的代码并处理异常:

try {

  $processor = new Processor();

  $processor->addProcess('a', new A());

  $processor->addProcess('b', new B());

  $processor->addProcess('c', new C());

  $processor->run('5');

} catch ( \Exception $e) {

  if ( $e instanceof ErrorException ) {
    // handle error exception
  }
  if ( $e instanceof ProcessException ) {
    echo $e->getMessage();
  }
  // ..
}

现在,如果我们退出而不是处理异常,那么我们将引入一个很难找到的错误。如果脚本在后台运行,我们甚至可能意识不到这样的“退出”。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多