4

EmacsのPHPファイルで未使用の変数を特定することはどういうわけか可能ですか?

他の言語では、Flymakeなどのツールを使用してこれを行うことができます。

私はすでにFlymakeを有効にしてPHPファイルの構文エラーをその場で表示していますが、それでもPHPロジックエラーが次のような状況に起因することがあるのはイライラします。

<?php
    $foo = whatever();
    $bar = something($fo);
    ...

foo開発者の頭痛と彼/彼女の法外なコーヒーの使用に寄与する$のタイプミスに注意してください。

Pascal と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

したがって、複数行のエラーに一致するように正規表現を少し変更する必要があると思います。これについて何かヒントはありますか?

4

3 に答える 3

5

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

エディターで取得するほど簡単ではないことは認めますが、何かが機能しない理由を見つけるのに役立ちます;-)

于 2010-03-28T19:27:37.673 に答える
2

Flymake はphpバイナリの構文チェック オプション ( -l) を使用して解析エラーを強調表示するため、実行またはコードの字句解析を行わずに通知やその他のエラーを検出する明らかな方法はありません。リントするだけでなく、スクリプトを実行しても問題ない場合は、次のことができます。

残念ながら、flymake-php(少なくとも Emacs スターター キットに同梱されているバンドルでは) エラー行パターンは一定として定義されており、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-php を初期化するための関数flymake-allowed-php-file-name-masksを使用するようにカスタマイズします。my-flymake-php-initそして、それは機能します:


(ソース: flickr.com )

于 2010-03-29T09:24:25.430 に答える
-4

適切な IDE では、Intellisense を介して変数を入力すると、現在のスコープ内の変数の名前が表示されます。

これにより、変数名のスペルを間違える回数が大幅に削減されます。また、変数名をよりわかりやすいものにすることもできます。$foo


さらに、未定義変数の警告には常に注意を払う必要があります。これは、スペルミスを犯したときにすぐに通知されるためです。

于 2010-03-28T19:26:39.987 に答える