Выявление PHP неиспользуемых переменных (в Emacs)? - PullRequest
4 голосов
/ 28 марта 2010

Возможно ли как-то идентифицировать неиспользуемые переменные в файле 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

Итак, я должен немного изменить регулярное выражение, чтобы оно соответствовало многострочным ошибкам. Любой намек на это?

Ответы [ 4 ]

5 голосов
/ 28 марта 2010

Это не совсем ответ на ваш вопрос, так как он не работает в emacs, но PHP может выдавать уведомления, когда вы пытаетесь прочитать переменную, которая не была инициализирована.

Для получения дополнительной информации см .:

  • error_reporting, что должно включать E_NOTICE
  • display_errors для отображения этих уведомлений (и других ошибок)
    • , что полезно при разработке
    • но не должен быть включен на производственном сервере.


Например, если для error_reporting задано сообщение E_NOTICE (и другие), следующая часть кода:

$aa = 'glop';
echo strlen($a);

Поднимает это уведомление:

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

Признаюсь, это не так просто, как попасть в ваш редактор, но все равно поможет выяснить, почему что-то не работает; -)

3 голосов
/ 29 марта 2010

Поскольку Flymake использует опцию проверки синтаксиса двоичного файла php (-l) для выделения ошибок синтаксического анализа, не существует очевидного способа отлавливать уведомления и другие ошибки без выполнения или лексического анализа кода. Если не проблема не только задержать, но и выполнить скрипт, вы можете сделать следующее.

К сожалению, 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 вместо исходной. И так работает:

1 голос
/ 30 июля 2011

Немного позднего ответа, но я подробно описал, как подключить Emacs Flymake с помощью PHP_CodeSniffer и плагина PHP_CodeSniffer-VariableAnalysis, который добавляет предупреждения о неиспользуемых переменных (и предупреждения о неопределенных переменных) в этот блог:

http://www.illusori.co.uk/perl/2011/07/25/perl_php_static_analysis_with_emacs_flymake.html

Быть автором разных кусочков, склеивающих все это, означает, что я немного предвзят, думая, что это хорошо работает, но я регулярно использую это для работы, и это помогает.

Этот метод работает статическим анализом источника, а не запуском программы, что полезно, если вы хотите избежать непреднамеренных побочных эффектов ...

0 голосов
/ 28 марта 2010

Приличные IDE дадут вам имена переменных в текущей области, когда вы набираете их через Intellisense.

Это должно значительно сократить количество ошибок при вводе имени переменной. Это также позволяет вашим именам переменных быть более информативными, чем $foo


Кроме того, вы всегда должны обращать внимание на неопределенные предупреждения о переменных, поскольку они сразу сообщают вам, когда вы допустили опечатку.

...