Это хорошая практика, чтобы умереть или выйти из длинных сценариев (PHP) - PullRequest
0 голосов
/ 11 июня 2018

Я смотрел на разные ответы, и кроме этого, который говорит о 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().

Спасибо

1 Ответ

0 голосов
/ 11 июня 2018

Использование die / exit является признаком плохого дизайна кода, что в конечном итоге приведет к ошибочному коду.В этом смысле это будет иметь негативные последствия.При запуске exit он завершает выполнение скрипта после вызова функции shutdown (если зарегистрирована функция обратного вызова shutdown).Единственный момент, когда die / exit дает положительный результат, если он используется с 0 (ноль), что успешно завершает выполнение скрипта.Все остальные случаи указывают на ошибки.В результате нет необходимости использовать выход.

Честно говоря, я должен добавить, что если ответ использует 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();
  }
  // ..
}

Теперь, если мы вышли, а не обработали исключение, мы бы представили ошибку, которую очень трудно найти.,Мы можем даже не знать о таком «выходе», если скрипт работает в фоновом режиме.

...