我正在使用一个开源项目,并认为使用 phpmd 实现自动代码修订是个好主意。
它向我展示了许多已经修复的编码错误。但其中一个让我很好奇。
考虑以下方法:
/**
*
* @param string $pluginName
*/
public static function loadPlugin($pluginName){
$path = self::getPath()."plugins/$pluginName/";
$bootPath = $path.'boot.php';
if(\is_dir($path)){
//Autoload classes
self::$classloader->add("", $path);
//If theres a "boot.php", run it
if(is_file($bootPath)){
require $bootPath;
}
}else{
throw new \Exception("Plugin not found: $pluginName");
}
}
在这里,phpmd说Else is never necessary
只要给定路径是文件或者根本不存在,...使用带有else分支的表达式永远不需要。您可以 以不必要的方式重写条件 代码变得更容易阅读。 ...
is_dir
将返回false,因此,在我看来,此测试根本无效。
有没有办法解决它或者可能只是忽略像这样的情况?
答案 0 :(得分:2)
我没有使用phpmd
,但很明显您的if
声明是一个保护条款。 Guard条款不需要else
分支,您可以安全地重构代码,如下所示:
/**
* @param string $pluginName
* @throws \Exception if plugin cannot be found
*/
public static function loadPlugin($pluginName)
{
$path = self::getPath() . "plugins/$pluginName/";
if (!\is_dir($path)) {
throw new \Exception("Plugin not found: $pluginName");
}
// Autoload classes
self::$classloader->add("", $path);
// If there is a "boot.php", run it
$bootPath = $path . 'boot.php';
if (is_file($bootPath)) {
require $bootPath;
}
}
进一步阅读:
答案 1 :(得分:1)
结构的替代方案是这样的:
public static function loadPlugin( $pluginName ) {
$path = self::getPath() . "plugins/$pluginName/";
$bootPath = $path . 'boot.php';
if( \is_dir( $path ) ) {
// Autoload classes
self::$classloader->add( "", $path );
// If theres a "boot.php", run it
if ( is_file( $bootPath ) ) {
require $bootPath;
}
// A return here gets us out of the function, removing the need for an "else" statement
return;
}
throw new \Exception( "Plugin not found: $pluginName" );
}
虽然我不确定它是解决方案,但它是一种避免else
条件的技术。在尝试读取代码时,其他条件会增加复杂性,并且允许函数“流动”而没有其他条件可以使它们更具可读性。