代码之家  ›  专栏  ›  技术社区  ›  Roberto Aloi

识别php未使用的变量(在emacs中)?

  •  4
  • Roberto Aloi  · 技术社区  · 16 年前

    是否可以在emacs中识别php文件中未使用的变量?

    对于其他语言,这可以通过使用诸如 苍蝇制作 . 我已经启用了flymake来显示php文件的语法错误 苍蝇 ,但仍然令人沮丧的是,php逻辑错误有时是由于以下情况造成的:

    <?php
    $foo = whatever();
    $bar = something($fo);
    ...
    

    注意打字错误$ foo 这将导致开发人员头痛和过度使用咖啡。

    更新:

    在pascal和gabor的提示下,我在php.in i中设置:

    error_reporting = E_ALL | E_STRICT
    

    当我从命令行运行php时,我现在可以看到关于未定义变量的通知(有或没有-l选项):

    > php -r '$foo = 3; echo $fo;'
    PHP Notice:  Undefined variable: fo in Command line code on line 1
    > php -r '$foo = 3; echo $fo;' -l
    PHP Notice:  Undefined variable: fo in Command line code on line 1
    

    这是我目前在.emacs中使用的。对于解析错误,它工作得非常好,但是我仍然无法匹配通知,尽管:(

    ;php的flymake (需要“flymake”)

    (defun flymake-php-init ()
      "Use php to check the syntax of the current file."
      (let* ((temp (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace))
         (local (file-relative-name temp (file-name-directory buffer-file-name))))
        (list "php" (list "-f" local "-l"))))
    
    (add-to-list 'flymake-err-line-patterns
                 '("\\(Parse\\|Fatal\\) error: +\\(.*?\\) in \\(.*?\\) on line \\([0-9]+\\)$" 3 4 nil 2))
    
    (add-to-list 'flymake-err-line-patterns
                   '("Notice: \\(.*\\) in \\(.*\\) on line \\([0-9]+\\)" 2 3 nil 1))
    
    (add-to-list 'flymake-allowed-file-name-masks '("\\.php$" flymake-php-init))
    

    我也试过gabor的配置。同样的结果。好的有错误,坏的有通知。

    请注意,在命令行中,解析错误如下所示:

    > php -r '$fo o = 3; echo $fo;' -l
    PHP Parse error:  syntax error, unexpected T_STRING in Command line code on line 1
    

    我不明白为什么通知不匹配。我已经分别尝试过正则表达式,它似乎匹配得很好:

    (search-forward-regexp "Notice: \\(.*\\) in \\(.*\\) on line \\([0-9]+\\)")
    
    PHP Notice:  Undefined variable: fo in Command line code on line 1
    

    ( C-x C-e 会跳到最后)。

    最后,我现在禁用了xdebug,因为通知最初报告为:

    PHP Notice:  Undefined variable: fo in Command line code on line 1
    PHP Stack trace:
    PHP   1. {main}() Command line code:0
    

    所以,我想我应该稍微更改regexp以匹配多行错误。有什么线索吗?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    因为flymake使用 php 二进制的语法检查选项( -l )为了突出显示解析错误,没有运行或词法解析代码就无法捕获通知和其他错误。如果不只是lint而是执行脚本不成问题,那么可以执行以下操作。

    不幸的是, flymake-php 将错误行模式定义为常量(至少在EmacsStarterKit附带的包中),甚至flymake命令都是硬编码的。有几种方法可以达到我们的目标,每一种方法都是痛苦的。也许这是一个快速而不肮脏的解决方案来定义我们 flymake-php-init 基于原始函数的函数。

    (defun my-flymake-php-init ()
      ;; add a new error pattern to catch notices
      (add-to-list 'flymake-err-line-patterns
                   '("\\(Notice\\): \\(.*\\) in \\(.*\\) on line \\([0-9]+\\)"
                     3 4 nil 2))
      (let* ((temp-file (flymake-init-create-temp-buffer-copy
                         'flymake-create-temp-inplace))
             (local-file  (file-relative-name
                           temp-file
                           (file-name-directory buffer-file-name))))
        ;; here we removed the "-l" switch
        (list "php" (list "-f" local-file))))
    

    然后自定义 flymake-allowed-php-file-name-masks 使用 my-flymake-php-init 用于初始化flymake php而不是原始php的函数。所以它起作用了:

        2
  •  5
  •   Pascal MARTIN    16 年前

    这并不能真正回答您的问题,因为它在emacs中不起作用,但是当您试图从一个未初始化的变量中读取数据时,php会引起注意。

    有关更多信息,请参见:


    例如,如果将error_reporting设置为report e_notice(和其他),则代码的以下部分:

    $aa = 'glop';
    echo strlen($a);
    

    发出此通知:

    Notice: Undefined variable: a in /.../temp/temp.php on line 5
    

    我承认,这并不像进入你的编辑室那么简单,但它仍然有助于找出为什么有些东西不起作用;-)

        3
  •  1
  •   Sam Graham    15 年前

    回答有点晚,但我已经详细介绍了如何将emacs flymake与php_codeniffer和php_codeniffer-variableanalysis插件连接起来,该插件在本博客中添加了未使用的变量警告(以及未定义的变量警告):

    http://www.illusori.co.uk/perl/2011/07/25/perl_php_static_analysis_with_emacs_flymake.html

    作为一个各种各样把它粘在一起的作者,我有点偏颇于认为它能很好地工作,但我经常用它来工作,它确实起到了作用。

    此方法通过对源代码进行静态分析而不是运行程序来工作,如果您希望避免意外的副作用…

        4
  •  -4
  •   Tyler Carter    16 年前

    当您通过intellisense输入变量时,体面的ide会给出当前作用域中变量的名称。

    这将大大减少您拼错变量名的次数。它还允许变量名比 $foo


    此外,您应该始终注意未定义的变量警告,因为它们会在您拼写错误时立即告诉您。

    推荐文章