PHPMD避免静态访问父级

时间:2013-09-04 01:44:22

标签: php oop static code-cleanup phpmd

有没有办法避免PHP类中的parent::静态访问器,或者这是使用@SuppressWarnings(StaticAccess)的时间之一?

同样,似乎这个StaticAccess警告在可疑的地方突然出现。例如,异常处理 - 当我throw new Exception(...)时,PHPMD抱怨静态访问。但是......没有其他方法可以做到(我已经发现)所以我有更多的警告抑制器比我想要的更多。这是正常的吗?

修改

根据要求,这是一个例子 - 它非常简单:

class aaa {
    private $someReasonForAnException = true;

    public function __construct() {
        echo 'AAA<br>';
        if ($this->someReasonForAnException) {
            throw new Exception("Something happened that's worth noticing!");
        }
    }
}

class bbb extends aaa {    
    public function __construct() {
        echo 'BBB<br>';
        parent::__construct();
    }
}

$BBB = new bbb();

PHPMD将报告上述两个错误:StaticAccess上出现Exception错误,StaticAccess来电时出现parent::__construct()错误。

为了避免这种情况,我必须用@SuppressWarnings来表示这两个类,这看起来很笨,并且也不会显示“真正的”静态访问问题。

3 个答案:

答案 0 :(得分:5)

一个简单而可持续的解决方案可能是

答案 1 :(得分:4)

没有其他方法可以在PHP上引用父方法的实现。您的代码没有任何问题,PHPMD已经醉了。使用静态访问的唯一问题是因为PHP允许您将实例方法作为静态方法调用,如果它不引用$this变量,但没有必要这样做。你可以忽略这种警告。

编辑:

如果你有这样的事情:

class Foo {
    public function bar() {
        echo 'bar';
    }
}

PHP允许你这样做:

Foo::bar(); // works

但如果你有这个:

class Foo {
    private $bar = 'bar';
    public function bar() {
        echo $this->bar;
    }
}

Foo::bar(); // fatal error

答案 2 :(得分:0)

因为我使用了很多self :: for常量,所以更改phpmd代码以接受self :: and parent ::。

在第36行的PHP / PMD / Rule / CleanCode / StaticAccess.php程序中,更改为:

if ($this->isReferenceInParameter($reference)
    || $reference->getImage() === 'self' 
    || $reference->getImage() === 'parent' 
    ) {
    continue;
}