是否有可能在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)
所以,我想我应该稍微更改正则表达式以匹配多行错误.关于这个的任何提示?
这不是你的问题的答案,因为它不适用于emacs,但是当你试图从一个尚未初始化的变量中读取时,PHP可以引发通知.
有关更多信息,请参阅:
error_reporting,应该包括 E_NOTICEdisplay_errors显示
那些通知(和其他错误)
例如,将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)
我承认,这并不像进入你的编辑那么简单 - 但仍然有助于找出为什么某些东西不起作用;-)