PHP Mess Detector给出误报

时间:2016-02-25 01:55:35

标签: php coding-style conventions phpmd

我正在使用一个开源项目,并认为使用 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,因此,在我看来,此测试根本无效。

有没有办法解决它或者可能只是忽略像这样的情况?

2 个答案:

答案 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条件的技术。在尝试读取代码时,其他条件会增加复杂性,并且允许函数“流动”而没有其他条件可以使它们更具可读性。