Betrachten Sie den folgenden Code, in dem der Setter absichtlich aufgrund eines profanen Programmierfehlers beschädigt wird, den ich in der Vergangenheit einige Male für real gemacht habe:
<?php
class TestClass {
private $testField;
function setField($newVal) {
$testField = $newVal;
// deliberately broken; should be `$this->testField = $newVal`
}
function getField() {
return $this->testField;
}
}
$testInstance = new TestClass();
$testInstance->setField("Hello world!");
// Actually prints nothing; getField() returns null
echo $testInstance->getField();
?>
Die Tatsache, dass ich $testField
an der Spitze der Klasse deklariert habe, hilft mir, diesen Programmierfehler vor mir zu verbergen. Wenn ich das Feld nicht deklariert hätte, würde beim Aufrufen dieses Skripts etwas Ähnliches wie die folgende Warnung in mein Fehlerprotokoll gedruckt, was möglicherweise hilfreich für mein Debugging wäre - insbesondere, wenn ich einen solchen Fehler in machen würde eine große und komplizierte reale Anwendung:
PHP-Hinweis: Undefinierte Eigenschaft: TestClass :: $ testField in /var/www/test.php in Zeile 13
Mit der Erklärung gibt es keine Warnung.
Vielleicht fehlt mir etwas, aber ich kenne nur zwei Gründe, um Klassenfelder in PHP zu deklarieren: Erstens, dass die Deklarationen als Dokumentation dienen, und zweitens, dass man ohne Deklarationen die Modifikatoren private
und protected
access nicht verwenden kann wohl nützlich. Da das letztere Argument nicht für öffentliche Felder gilt - die Zuweisung zu einem nicht deklarierten Feld eines Objekts macht es öffentlich -, sollte ich zumindest alle meine öffentlichen Felddeklarationen auskommentieren. Die Kommentare liefern genau den gleichen Dokumentationswert, aber ich werde von Warnungen profitieren, wenn ich versuche, ein nicht initialisiertes Feld zu lesen.
Bei weiteren Überlegungen scheint es jedoch nicht sinnvoll zu sein, hier anzuhalten. Da meiner Erfahrung nach der Versuch, ein nicht initialisiertes Feld zu lesen, eine viel häufigere Fehlerursache ist als der Versuch, ein privates oder geschütztes Feld unangemessen zu lesen oder zu ändern (das erstere habe ich bereits in meiner kurzen Programmierkarriere mehrmals gemacht, das letztere jedoch nie ), es scheint mir, als wäre es eine bewährte Methode, alle Felddeklarationen - nicht nur die öffentlichen - zu kommentieren.
Was mich zögern lässt, ist, dass ich noch nie jemanden gesehen habe, der dies in seinem Code getan hat. Warum nicht? Hat das Deklarieren von Klassenfeldern, die mir nicht bekannt sind, einen Vorteil? Oder kann ich die PHP-Konfiguration auf irgendeine Weise ändern, um das Verhalten von Felddeklarationen so zu ändern, dass ich echte Felddeklarationen verwenden und trotzdem von Warnungen "Undefinierte Eigenschaften" profitieren kann? Oder gibt es noch etwas, das ich in meiner Analyse übersehen habe?
TRUE === $variable
Sie sich nicht versehentlich die Zuordnung statt zu vergleichen.Antworten:
Sie sollten Ihre Klasseneigenschaften immer im Voraus deklarieren. Während PHP eine dynamische Sprache ist und Sie gerne zur Laufzeit beim Erstellen Ihrer Eigenschaften unterstützt, hat dieser Pfad mehrere Nachteile.
Das Problem , das Du beschrieben ist eigentlich ein geringfügiger , wenn der auf das Problem im Vergleich nicht erklärt Ihre Eigenschaften in Ihrer Klassendefinition. Hier ist eine gute Lösung.
Gewöhnen Sie sich daran, Standardeinstellungen für Ihre Eigenschaften zu deklarieren.
Mit Ausnahme von Eigenschaften, in denen Objekte gespeichert werden, deckt dies die meisten Basistypen ab, die Sie speichern werden. Die Eigenschaften, in denen Objekte gespeichert werden, können in Ihrem Konstruktor festgelegt werden.
Eine gute Regel für das Klassendesign ist, dass Sie nach dem Erstellen Ihres Objekts und dem Ausführen Ihres Konstruktors keine Eigenschaften "undefiniert" haben sollten.
quelle
Ich habe an Code gearbeitet, der dynamisch erstellte Objekteigenschaften verwendet. Ich fand die Verwendung dynamisch erstellter Objekteigenschaften ziemlich cool (meiner Meinung nach wahr). Die Ausführung meines Programms dauerte jedoch 7 Sekunden. Ich habe die dynamischen Objekteigenschaften entfernt und sie ersetzt, die als Teil jeder Klasse deklariert wurden (in diesem Fall öffentlich). Die CPU-Zeit stieg von über 7 Sekunden auf 0,177 Sekunden. Das ist ziemlich umfangreich.
Es ist möglich, dass ich bei der Verwendung dynamischer Objekteigenschaften etwas falsch gemacht habe. Es ist auch möglich, dass meine Konfiguration auf irgendeine Weise beschädigt ist. Natürlich sollte ich sagen, dass ich eine sehr einfache Vanille-PHP-Konfiguration auf meinem Computer habe.
quelle