代码之家  ›  专栏  ›  技术社区  ›  Eduardo Ponce de Leon

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

  •  0
  • Eduardo Ponce de Leon  · 技术社区  · 7 年前

    我看过不同的答案,除了这个 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()

    还是让剧本结束比较好 会加速这个过程吗?如果 当然,也有其他的方法,比如创建标志让脚本跳过某些代码块,我只想知道

    例如: 模具() -在时间/执行方面 加快进程的速度,因为它不会尝试执行脚本的其余部分,或者根本不起作用。想象一下,在代码下面可能有一个可以避免的繁重过程。

    我想说清楚这一点,我知道必须有许多其他的方法来提高效率,缩短脚本,开关,标志等,我只是想了解如果有任何负面影响使用 .

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   evansgambit    7 年前

    回调函数已注册)。只有当与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 {
    
      $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。如果脚本在后台运行,我们甚至可能不知道这样的“退出”。