【发布时间】: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开关获得关于未使用变量的通知。