识别PHP未使用的变量(在Emacs中)?

Rob*_*loi 4 php emacs flymake

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

使用其他语言,可以使用flymake等工具.我已经启用了Flymake,以示对我的PHP文件的语法错误的飞行,但它仍然是令人沮丧的是PHP逻辑错误,有时由于类似的情况:

<?php
$foo = whatever();
$bar = something($fo);
...
Run Code Online (Sandbox Code Playgroud)

请注意$ foo上的错字将导致开发人员的头痛和他过度使用咖啡.

更新:

在Pascal和Gabor的提示之后,我在php.ini中设置:

error_reporting = E_ALL | E_STRICT
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行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
Run Code Online (Sandbox Code Playgroud)

这就是我目前在.emacs中使用的内容.它完全没有解析错误,但我仍然无法匹配通知,但:(

;; FlyMake for Php(需要'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))
Run Code Online (Sandbox Code Playgroud)

我也试过Gabor的配置.结果相同.错误很好,通知很糟糕.

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

> php -r '$fo o = 3; echo $fo;' -l
PHP Parse error:  syntax error, unexpected T_STRING in Command line code on line 1
Run Code Online (Sandbox Code Playgroud)

我不明白为什么通知不匹配.我已经单独尝试了正则表达式,它似乎正确匹配:

(search-forward-regexp "Notice: \\(.*\\) in \\(.*\\) on line \\([0-9]+\\)")

PHP Notice:  Undefined variable: fo in Command line code on line 1
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

所以,我想我应该稍微更改正则表达式以匹配多行错误.关于这个的任何提示?

Pas*_*TIN 5

这不是你的问题的答案,因为它不适用于emacs,但是当你试图从一个尚未初始化的变量中读取时,PHP可以引发通知.

有关更多信息,请参阅:


例如,将error_reporting设置为报告E_NOTICE(和其他),代码的以下部分:

$aa = 'glop';
echo strlen($a);
Run Code Online (Sandbox Code Playgroud)

提出这个通知:

Notice: Undefined variable: a in /.../temp/temp.php on line 5
Run Code Online (Sandbox Code Playgroud)

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