首页 > 解决方案 > 在长脚本中死亡或退出是一种好习惯(PHP)

问题描述

我查看了不同的答案,除了这个在测试和生成错误时谈论die 的答案之外,我想知道 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().

谢谢

标签: phpexitdie

解决方案


die/exit 的使用是糟糕的代码设计的标志,它最终会导致错误的代码。从这个意义上说,它会产生负面影响。当 exit 运行时,它会在调用关闭函数后终止脚本执行(如果注册了关闭回调函数)。如果与 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();
  }
  // ..
}

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


推荐阅读