2012-08-14 51 views
0

我最近一直在編碼標準,並希望使用codesniffer來檢查我的文件,根據這個標準。 由於我是Codesniffer的新手,我想在創建自己的標準之前先測試標準。Codesniffer標準不能正常工作

但是,我遇到了codesniffer的問題,我不確定這是一個錯誤還是我做錯了什麼。

我有梨使用命令行命令pear install CodeSniffer後,我試圖用我的測試文件不同的標準安裝代碼嗅探器:

<?php 
public class Application_IndexController() { 

    DEFINE WEBSITE_URL = 'https://localhost/'; 

    public $avast = ''; 
    private $_ye = ''; 
    protected $_swabs = ''; 

    public setAvast($avast){ 
     $this->avast = $avast; 
    } 

    private getYe(){ 
     return $this->_ye; 
    } 

    protected changeProtected($_swabs){ 
     if($_swabs && $this->swabs) { 
      $this->_swabs = $swabs; 
     } elseif($swabs) { 
      $this->_swabs = $swabs; 
     } else { 
      return null; 
     } 
    } 

    public iDontKnowWhatImDoing($harhar) { 
     Switch($harhar) { 
      case 1: 
       $yargh = "Avast ye " 
         . "swabs!"; 
       echo $yargh; 
       break; 
      default: 
       $array = array(
           "Sailor 1", "Sailor 2", "Sailor 3", 
           "Sailor 4", "Sailor 5", "Sailor 5" 
           ); 
       break; 
     } 
    } 
} 
?> 

我只想說,我是在一個相當愚蠢的心情,同時書面方式這個文件,但不管它滿足它的目的。

我已經在這個文件上運行了所有的標準,只有其中的幾個實際上工作,另一個似乎總是返回相同的錯誤。

'通用','psr1'和'psr2'標準工作得很好,'phpcs','pear','mysource','zend'和'squiz'標準都會導致一個錯誤:

$stackPtr is not a class member var 

似乎很奇怪,8中有5個不能正常工作,包括phpcs自己的標準。

回答

0

首先,您得到該錯誤消息的原因是因爲您的文件有解析錯誤。類定義不正確,並且DEFINE WEBSITE_URL = 'https://localhost/';也是無效的PHP代碼。您的所有函數聲明在可見性關鍵字之後也缺少function

檢查分析錯誤的最佳方法是運行php -l /path/to/code(這是一個小寫的L)。

PHPCS實際上並不像PHP那樣解析你的文件。相反,它是一個靜態代碼分析器,但它確實會進入代碼看起來錯誤並且無法繼續的情況。這只是其中的一種情況。

其次,一些標準的工作原理和一些標準沒有的原因是因爲所有的標準都有不同的檢查。許多標準共享這些檢查。在這種特殊情況下,一些標準對變量名稱進行檢查,並且由於不正確的函數聲明而失敗。他們無法弄清楚爲什麼他們失敗了,因爲他們太過分了(121令牌),但他們知道出了問題。我知道錯誤信息不是很有幫助,但足以讓您知道發生了什麼不愉快的事情,並且文件存在問題。在這種情況下,解析錯誤。

總而言之:如果您修復瞭解析錯誤,那麼所有PHP_CodeSniffer標準都將在您的代碼上運行。未來,使用php -l命令檢查代碼中的解析錯誤或在PHPCS檢查之前將其包含在構建腳本中(如果使用持續集成),總是有用的。

萬一有幫助,這裏是用解析錯誤代碼固定:

<?php 
define('WEBSITE_URL', 'https://localhost/'); 
class Application_IndexController { 

    public $avast = ''; 
    private $_ye = ''; 
    protected $_swabs = ''; 

    public function setAvast($avast){ 
     $this->avast = $avast; 
    } 

    private function getYe(){ 
     return $this->_ye; 
    } 

    protected function changeProtected($_swabs){ 
     if($_swabs && $this->swabs) { 
      $this->_swabs = $swabs; 
     } elseif($swabs) { 
      $this->_swabs = $swabs; 
     } else { 
      return null; 
     } 
    } 

    public function iDontKnowWhatImDoing($harhar) { 
     Switch($harhar) { 
      case 1: 
       $yargh = "Avast ye " 
         . "swabs!"; 
       echo $yargh; 
       break; 
      default: 
       $array = array(
           "Sailor 1", "Sailor 2", "Sailor 3", 
           "Sailor 4", "Sailor 5", "Sailor 5" 
           ); 
       break; 
     } 
    } 
} 
?> 
+0

感謝您的解釋!我的印象是它也能夠返回PHP解析錯誤。 – 2012-08-15 07:12:22