我看过不同的答案,除了这个讨论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()
在第一个条件下,它将停止执行其余的代码,理论上,这应该优化性能,或者可能不是......
让脚本结束或die()
实际上会加快进程是否更好?如果die()
有负面影响,当然,还有其他方法,比如创建标记让脚本跳过某些代码块,我只想知道die()
的负面影响(如果有的话)。
例如:
- 在内存方面,die()
将继续使用内存,或者它可以释放更多内存。
- 在时间/执行方面,die()
将加速进程,因为它不会尝试执行脚本的其余部分,或者根本没有任何区别。想象一下,在代码中可能存在可以避免的繁重过程。
我想清楚这一点,我知道必须有许多其他方法来提高效率,缩短脚本,开关,标志等。我只想了解使用{{1}是否有任何负面影响}。
由于
答案 0 :(得分:0)
die / exit的使用是代码设计不佳的标志,最终会导致错误的代码。从这个意义上说,它会产生负面影响。退出运行时,它会在调用shutdown函数后终止脚本执行(如果是shutdown 回调函数已注册)。如果使用0(零)来成功终止脚本执行,则die / 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();
}
// ..
}
现在,如果我们退出而不是处理Exception,那么我们将引入一个很难找到的bug。我们可能甚至不知道这样一个退出'退出'如果脚本在后台运行。