首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在长脚本(PHP)中死掉或退出是一种好的做法吗?

在长脚本(PHP)中死掉或退出是一种好的做法吗?
EN

Stack Overflow用户
提问于 2018-06-11 23:14:36
回答 1查看 158关注 0票数 0

我已经看过了不同的答案,除了这个关于die while testing and generating errors的答案,我想知道当继续执行是无用的时候,die()是否会对我的代码产生负面影响。

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

代码语言:javascript
复制
$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()是否有任何负面影响。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 03:49:22

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

坦率地说,我应该补充说,如果答案是使用exit/die,那么要么问题是错误的,要么是脚本写得很糟糕。在您的示例中,如果脚本需要根据某个值运行,则代码应如下所示:

代码语言:javascript
复制
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块中运行上面的代码并处理异常:

代码语言:javascript
复制
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();
  }
  // ..
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50800990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档