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
Простое и устойчивое решение может быть
- переопределить набор правил чистого кода
- Установите свойство "исключения" в правиле StaticAccess, чтобы включить self и parent:
Поскольку я использую много self:: для констант, измените код phpmd, чтобы принимать self:: и parent::.
В программе PHP/PMD/Rule/CleanCode/StaticAccess.php в строке 36 измените на:
if ($this->isReferenceInParameter($reference)
|| $reference->getImage() === 'self'
|| $reference->getImage() === 'parent'
) {
continue;
}