簡體   English   中英

在長腳本中死掉還是退出是一種好習慣(PHP)

[英]Is it good practice to die or exit in long scripts (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()加快進程的速度,因為它不會嘗試執行腳本的其余部分,或者根本沒有區別。 想象一下,在代碼中可能會避免繁重的過程。

我想對此進行澄清,我知道必須有許多其他方法來提高效率,縮短腳本,開關,標志等。我只想了解使用die()是否有負面影響。

謝謝

使用die / exit表示代碼設計不佳,最終會導致錯誤的代碼。 從這個意義上講,它將產生負面影響。 運行exit時,它將在調用shutdown函數后終止腳本執行(如果已注冊shutdown回調函數)。 如果將die / exit與0(零)一起使用,則die / exit唯一一次會產生正輸出,這將成功終止腳本執行。 所有其他出現都指向錯誤。 結果,不需要使用出口。

坦白說,我應該補充一點,如果答案是使用退出/死機,那么問題要么是錯誤的,要么腳本編寫得不好。 在您的示例中,如果腳本需要根據值運行,則代碼應類似於:

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();
  }
  // ..
}

現在,如果我們退出而不是處理異常,那么我們將引入一個很難發現的錯誤。 如果腳本在后台運行,我們甚至可能不會意識到這種“退出”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM