我已经看过了不同的答案,除了这个关于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()
会加速进程,因为它不会尝试执行脚本的其余部分,或者根本没有区别。想象一下,在代码下面可能会有一个可以避免的繁重过程。
我想要弄清楚这一点,我知道肯定有许多其他方法可以更有效,更短的脚本,开关,标志等。我只想了解使用die()
是否有任何负面影响。
谢谢
发布于 2018-06-12 03:49:22
使用die/exit是糟糕的代码设计的标志,它最终会导致错误代码。从这个意义上说,它会产生负面影响。当exit运行时,它在调用shutdown函数后终止脚本执行(如果注册了shutdown回调函数)。如果将其与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/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();
}
// ..
}
现在,如果我们退出而不是处理异常,那么我们将引入一个很难找到的bug。如果脚本在后台运行,我们甚至可能不知道这样的“退出”。
https://stackoverflow.com/questions/50800990
复制相似问题