2013-09-04 4 views
1

Есть ли способ избежать статического аксессора parent:: в классах PHP, или это одно из тех случаев, когда используется @SuppressWarnings(StaticAccess)?PHPMD избежать статического доступа к родительскому

На тех же строках похоже, что это StaticAccess Предупреждение появляется в подозрительных местах. Обработка исключений, например - когда я throw new Exception(...), PHPMD жалуется на статический доступ. Но ... на самом деле нет другого способа сделать это (что я нашел), поэтому у меня есть больше предупреждающих супрессоров, чем хотелось бы. Это нормально?

EDIT

В соответствии с просьбой, вот пример - это довольно просто:

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, который кажется неуклюжим, а также не будет показывать «реальные» проблемы статического доступа.

+0

Отправьте свой код, пожалуйста ... –

+0

@HenriqueBarcelos - спасибо, что посмотрели, есть пример. – Ben

+0

Вы не делаете никаких статических вызовов; Я бы сообщил об этом как об ошибке. –

ответ

4

Нет другого способа ссылки на реализацию метода родителя на PHP. В коде нет ничего плохого, PHPMD пьян. Единственная проблема, с которой вы столкнулись со статическим доступом, заключается в том, что PHP позволяет вызывать метод экземпляра как статический метод, если он не ссылается на переменную $this, но при этом нет никакого смысла. Вы можете игнорировать это предупреждение.

Edit:

Если у вас есть что-то вроде этого:

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 
+0

Хорошие новости, я полагаю. Не могли бы вы объяснить, что «PHP позволяет вам вызвать метод экземпляра как статический метод, если он не ссылается на эту переменную $, но нет смысла делать это». Немного по-другому? Я не совсем понимаю.Вы имеете в виду, PHP будет вызывать экземпляр как статический метод, по умолчанию? – Ben

0

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

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

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

Отлично, но как насчет того, когда вам нужно обновить PHPMD? ;) – Ben