PHPMD избегает статического доступа к родителю

Есть ли способ избежать parent:: статический аксессор в классах PHP, или это один из тех случаев, чтобы использовать @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 ответа

Решение

Нет другого способа сослаться на реализацию метода родителя в 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

Простое и устойчивое решение может быть

Поскольку я использую много self:: для констант, измените код phpmd, чтобы принимать self:: и parent::.

В программе PHP/PMD/Rule/CleanCode/StaticAccess.php в строке 36 измените на:

if ($this->isReferenceInParameter($reference)
    || $reference->getImage() === 'self' 
    || $reference->getImage() === 'parent' 
    ) {
    continue;
}
Другие вопросы по тегам