Возможно ли как-то идентифицировать неиспользуемые переменные в файле PHP в Emacs?
Для других языков это возможно с помощью таких инструментов, как flymake .
Я уже включил Flymake, чтобы показывать синтаксические ошибки для моих файлов PHP на лету , но, тем не менее, досадно, что ошибки логики PHP иногда возникают из-за ситуаций, подобных:
<?php
$foo = whatever();
$bar = something($fo);
...
Обратите внимание на опечатку на $ foo
, которая усугубит головную боль разработчика и его чрезмерное употребление кофе.
UPDATE:
После подсказок Паскаля и Габора я установил в своем 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 для 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))
Я также попробовал конфигурацию Габора. Тот же результат. Хорошо с ошибками, плохо с уведомлениями.
Обратите внимание, что из командной строки ошибки разбора выглядят так:
> 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
Итак, я должен немного изменить регулярное выражение, чтобы оно соответствовало многострочным ошибкам. Любой намек на это?