【问题标题】:How can I identify PHP unused variables (in Emacs)?如何识别 PHP 未使用的变量(在 Emacs 中)?
【发布时间】:2010-03-28 19:23:49
【问题描述】:

是否有可能在 Emacs 中识别 PHP 文件中未使用的变量?

对于其他语言,这可以通过使用诸如Flymake 之类的工具来实现。

我已经启用 Flymake 以实时显示我的 PHP 文件的语法错误,但仍然令人沮丧的是,PHP 逻辑错误有时是由于以下情况造成的:

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

请注意 $foo 上的拼写错误,这将导致开发人员头疼并导致他/她过度使用咖啡。

在提示 by Pascal and viam0Zah 之后,我在我的 php.ini 文件中设置了这个:

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 文件中使用的。它可以很好地处理解析错误,但我仍然无法匹配通知:(

;; Flymake for PHP
(require '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

所以,我想我应该稍微更改正则表达式以匹配多行错误。有什么提示吗?

【问题讨论】:

  • 您确定没有 -l 开关会收到通知吗? -l 应该只提到语法错误而不是运行时。
  • 我无法通过-l 开关获得关于未使用变量的通知。

标签: php emacs flymake


【解决方案1】:

这并不是您问题的真正答案,因为它在 Emacs 中不起作用,但是当您尝试从未初始化的变量中读取时,PHP 会引起注意。

欲了解更多信息,请参阅:


例如,将 error_reporting 设置为报告 E_NOTICE(和其他),以下代码部分:
$aa = 'glop';
echo strlen($a);

发出此通知:

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

我承认,这并不像在编辑器中那样简单——但它仍然有助于找出为什么某些东西不起作用 ;-)

【讨论】:

  • 我会在星期一试一试,我会告诉你的。将它添加到我的 flymake 配置中应该不会太复杂。非常感谢。
【解决方案2】:

由于 Flymake 使用 php 二进制文件的语法检查选项 (-l) 来突出显示解析错误,因此没有明显的方法可以在不运行或词法解析代码的情况下捕获通知和其他错误。如果不仅 lint 还执行脚本没有问题,那么您可以执行以下操作。

不幸的是,flymake-php 将错误行模式定义为常量(至少在 Emacs Starter Kit 附带的捆绑包中),甚至 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,而不是原来的。所以它起作用了:


(来源:flickr.com

【讨论】:

    【解决方案3】:

    当您通过 Intellisense 键入变量时,体面的 IDE 会为您提供当前范围内的变量名称。

    这应该会大大减少您拼错变量名的次数。它还允许您的变量名称比$foo更具描述性


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

    【讨论】:

    • $foo 显然只是一个例子。几天前,我花了大约 10 分钟才明白我使用的是 $submision_id 而不是 $submission_id。我将忽略“体面”的挑衅,只是说自动完成功能在 Emacs 中也可用,并且 Emacs 是免费的并且可以在 Linux 上运行,而 Visual Studio 则不能。顺便说一句,这不应该是评论而不是答案吗? :)
    • 我刚刚看到您的编辑。 xdebug.org 跟踪和调试功能也很酷。我的意思是,使用 Visual Studio 没有任何问题。只是,我看不出用“不要使用 X 编辑器。Y 更好。”之类的答案来回答“我如何使用 X 文本编辑器做到这一点”之类的问题有什么意义。我们都有自己喜欢的 IDE 或文本编辑器。最好的是你更有效率的那个。还是谢谢。
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多