Nach einem Refactoring
wäre es gut, dies in erster Linie zu verhindern.
Sie können diese Art von Refactoring-Fehlern nur durch Ausführen von Tests nach jedem Refactoring-Schritt erkennen. Dieser Fehler wird auch auftreten, weil foo['blubb']
auf einen bestimmten Wert eingestellt ist und dies sollte einen unerwünschten Effekt in einem anderen Test verursachen - nicht nur im Test für die Setter-Logik.
Wir Tests verwenden, aber manchmal vermisst du Dinge ...
Ja, es ist durchaus üblich, dass die Abdeckung nicht hoch genug ist. Deshalb ist eine gute Testabdeckung der Ausgangspunkt für alle Refactorings.
Diese beiden Linien waren nicht „grün“ in Ihrer Berichterstattung Bericht:
if(!isset($this->bla['blubb'])) {
$this->foo['blubb'] = $value;
Sie bitte auch, kommen nicht die magischen Methoden mit Überschreiben auf. Ich will keine Eigenschaft/Zusammenfassung haben, was auch immer in jeder Klasse.
Sie haben es ausgeschlossen, aber das ist ein Weg, um die Eigenschaften zu fangen: durch die magische Funktion __set()
(für unzugängliche VARs) oder property_exists()
oder die Verwendung von Reflection*
Klassen zu finden.
Nun, das es zu spät ist, wollen Sie ein anderes Werkzeug, um den Fehler zu fangen, ok:
Das Tool müsste die PHP-Datei und deren Eltern (wegen der variablen Umfang) und $this->bla
finden analysieren ohne vorherige public|private|protected
Variable (Klasseneigenschaft) Deklaration. Dies zeigt nicht den genauen Fehlertyp an, nur dass auf "bla" ohne Deklaration zugegriffen wurde.
Es ist möglich, dies als CodeSniffer-Regel zu implementieren.
Sie können auch http://phpmd.org/ oder https://scrutinizer-ci.com/ einen Versuch geben. Und Sie im Falle verwenden PHP7: https://github.com/etsy/phan
tl; tr
Sein kompliziert ohne Laufen, Auswertung und Analyse der zugrunde liegenden Code den genauen Fehler und seinen Kontext zu bestimmen. Denken Sie nur an "dynamische Variablennamen" und Sie wissen warum: Sie wissen nicht einmal den Namen der Eigenschaft, indem Sie sich den Quellcode ansehen, da dieser dynamisch während des Programmablaufs erstellt wird. Ein statischer Analysator würde das nicht verstehen.
Ein dynamischer Analysator muss alle Dinge verfolgen, hier $this->
greift zu und würde den Kontext berücksichtigen:! Isset (x). Die Kontextauswertung kann viele häufige Programmierfehler finden. Am Ende können Sie einen Bericht erstellen: sagen, dass $ this-> bla nur 1 Mal zugegriffen wurde und zeigt an, dass entweder
- eine dynamisch deklarierte Eigenschaft eingeführt wurde, aber nie wieder verwendet, mit dem Vorschlag, dass Sie könnte es fallen lassen oder deklarieren als Klasseneigenschaft
- ODER mit hinzugefügter Kontextevaluierung: das und wenn auf diese Variable von innerhalb eines isset() zugegriffen wurde - dass auf einen nicht existierenden Schlüssel einer nicht deklarierten Eigenschaft zugegriffen wurde, ohne a prior set() usw.
Können Sie nach undefinierten Variablen suchen, da $ this-> bla nicht deklariert würde? Möglicherweise müssen Sie den Code in PHPCodeSniffer erweitern. –
Ich versuche es, aber ich habe auf einen offensichtlichen und einfachen Weg gehofft. – Kasihasi
Hast du nach Squizlabs (http://www.squizlabs.com/) oder ihrem GitHub (https://github.com/squizlabs/PHP_CodeSniffer), da Greg Sherwood in der Vergangenheit sehr gut auf Fragen reagiert hat. –