(Emacs) PHP kullanılmayan değişkenleri belirleme?

4 Cevap php

Bu Emacs bir PHP dosyası kullanılmayan değişkenleri tespit etmek mümkün nasılsa mı?

With other languages, this is possible by using tools such as flymake. I've already enabled Flymake to show syntax errors for my PHP files on the fly, but still it's frustrating that PHP logic errors are sometimes due to situations like:

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

$ Üzerinde yazım hatası not foo O geliştirici baş ağrısı ve kahve onun fahiş kullanımına katkıda bulunacaktır.

UPDATE:

Pascal ve Gabor tarafından ipuçları sonra, benim php.ini içinde:

error_reporting = E_ALL | E_STRICT

Ben komut satırından php çalıştırdığınızda, ben şimdi (seçeneği ile ya-l olmadan) tanımsız değişken hakkında haber görmek mümkün değilim:

> 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

Bu şu anda benim. Emacs kullanıyorum budur. Bu ayrıştırma hataları ile mükemmel çalışıyor, ama ben yine de, hala bildirimlerle ilgili eşleşmesi mümkün değilim: (

;; 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))

Ben de Gabor yapılandırmasını denedim. Aynı sonuç. Hataları ile ince, bildirimler ile kötü.

Komut satırından, hatalar benziyor ayrıştırmak unutmayın:

> php -r '$fo o = 3; echo $fo;' -l
PHP Parse error:  syntax error, unexpected T_STRING in Command line code on line 1

Uyarılar uyumlu değil neden ben alamadım. Ben ayrı ayrı normal ifadeyi denedim ve doğru maç gibi görünüyor:

(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 hatlarının sonuna atlamak olacaktır).

: Son olarak, ben şimdi özürlü XDebug, bildirimler başlangıçta olarak rapor edildi beri

PHP Notice:  Undefined variable: fo in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0

Yani, ben biraz satırlı hataları maç regexpi değiştirmek gerekir sanırım. Bu konuda herhangi bir ipucu?

4 Cevap

Flymake (-l) Ayrıştırma hataları vurgulayarak için php İkili sözdizimi onay seçeneği kullanır bu yana, çalışan ya da sözcük kodu ayrıştırma olmadan bildirimleri ve diğer hataları yakalamak için belirgin bir yolu yoktur. O sadece tüysüz bir sorun değil ama çalıştırmak istersek, o zaman aşağıdakileri yapabilirsiniz.

Ne yazık ki, flymake-php (en azından Emacs Starter Kit ile birlikte paket) sürekli olarak hata çizgi desenleri tanımlar, ve hatta flymake komut kodlanmış olduğunu. Orada bizim hedefe ulaşmak için birkaç yolu olduğunu ve her bir ağrıdır. Bu orijinal bir dayalı bizim flymake-php-init fonksiyonunu tanımlamak için hızlı ve çok kirli değil çözüm olabilir.

(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))))

Sonra flymake-allowed-php-file-name-masks flymake-php yerine özgün bir başlatma için my-flymake-php-init işlevi kullanmak için özelleştirebilirsiniz. Ve böylece çalışır:

O emacs çalışma değil, ama başlatılmamış değil bir değişken okumaya çalışırken PHP, bildirimleri yükseltmek gibi, gerçekten soruya bir cevap değil.

Detaylı bilgi için, bkz:


For example, with error_reporting set to report E_NOTICE (and others), the following portion of code :

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

Bu haber Artırdı:

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

Bu editörü almak kadar basit değil, itiraf - ama hala bir şey neden çalışmıyor bulmaya yardımcı olacak ;-)

Geç cevap biraz, ama ben PHP_CodeSniffer ve bu blogda (çok tanımsız ve değişken uyarı) kullanılmayan değişken uyarıları ekler PHP_CodeSniffer-VariableAnalysis eklentisi ile Emacs Flymake bağlamak nasıl ayrıntılı ettik:

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

Hepsini tutkal çeşitli bit yazarı olmak birlikte iyi çalıştığını düşünerek biraz önyargılı değilim, ama iş için düzenli olarak kullanın ve hile yok demektir.

Bu yöntem yerine size istenmeyen yan etkileri önlemek istiyorsanız yararlıdır programını çalıştırarak daha kaynağının statik analizi ile çalışır ...

Eğer Intellisense'yi üzerinden bunları yazarken terbiyeli IDE geçerli kapsamda size değişkenlerin isimlerini vereceğiz.

Bu ciddi bir değişken adını yanlış sayısını azaltmak gerekir. Ayrıca değişken adları $foo daha açıklayıcı olmasını sağlar


Eğer bir yazım hatası yapmış zaman hemen size haber Dahası, her zaman, tanımsız değişken uyarılara dikkat etmelidir.