Alle privaten / lokalen Variablen vordefinieren?

8

Das mag eine grundlegende Frage sein, aber ich habe mich schon eine ganze Weile gewundert.

Sollte ich alle privaten / lokalen Variablen für privat erklären? Oder ist das nur für "wichtige" Variablen nötig?

Zum Beispiel habe ich das (temporäre) Ergebnis einer Berechnung. Soll ich diese Variable vorab deklarieren?

Hoffe, jemand kann darauf hinweisen.

    
Hans 17.07.2013, 09:38
quelle

4 Antworten

1

Im Allgemeinen ist es eine gute Faustregel, dass Variablen vor der Verwendung definiert und initialisiert werden. Dazu gehören nicht nur die Definition und der Anfangswert, sondern auch die Validierung und Filterung der Eingabewerte, so dass alle Vorbedingungen, auf denen ein Codeabschnitt basiert, vor der konkreten Verarbeitung der Daten, die diese Variablen enthalten, festgelegt werden.

Dies gilt natürlich auch für Objektelemente (Eigenschaften), da diese die Variablen des gesamten Objekts sind. Daher sollten sie bereits in der Klasse definiert sein (standardmäßig ist ihr Wert NULL in PHP). Dynamische Werte / Filterung können in den Konstruktor- und / oder Setter-Methoden vorgenommen werden.

Die Regel für die Sichtbarkeit ähnelt einer Regel im Code: so wenig wie nötig (die einfache Regel, die so schwer zu erreichen ist). Halten Sie die Dinge also lokal und dann privat - abhängig davon, ob es sich um eine Funktionsvariable oder eine Objekteigenschaft handelt.

Und vielleicht behalten Sie im Hinterkopf, dass Sie in PHP auf private Eigenschaften innerhalb derselben Klasse zugreifen können - nicht nur auf das gleiche Objekt. Dies kann nützlich sein, da es Ihnen ermöglicht, die Dinge ein wenig länger geheim zu halten.

  

Zum Beispiel habe ich das (temporäre) Ergebnis einer Berechnung. Soll ich diese Variable vorab deklarieren?

Dies ist normalerweise eine lokale Variable in einer Funktion oder Methode. Es ist definiert, wenn es den Rückgabewert der Berechnungsmethode erhält. Es ist also nicht notwendig, es vorher per Deklaration zu deklarieren.

%Vor%

Wenn die Berechnung teuer ist / war, kann es sinnvoll sein, den Wert zu speichern (zu cachen). Das funktioniert einfach, wenn Sie das zum Beispiel innerhalb eines Objekts kapseln. In diesem Fall verwenden Sie eine private Eigenschaft, um den einmal berechneten Wert zu speichern.

Nehmen Sie diese Regel mit einem Körnchen Salz, sie sind für die allgemeine Orientierung, können Sie leicht davon ändern, so dass dies offen ist zu erweitern, so eine gute Möglichkeit, die Dinge flexibel zu halten.

    
hakre 17.07.2013, 13:34
quelle
8

Da du von private , protected und public sprichst, nehme ich an, dass du über Eigenschaften anstelle von Variablen sprichst.
In diesem Fall: yes sollten Sie vorher deklarieren.

Aufgrund der Art und Weise, wie PHP-Objekte entworfen werden, wird zum Zeitpunkt der Kompilierung ein Array ( properties_table ) erstellt. Dieses Array stellt sicher, dass der Zugriff auf eine bestimmte Eigenschaft so schnell wie möglich erfolgt. Wenn Sie jedoch Eigenschaften hinzufügen, muss PHP dies auch im Auge behalten. Aus diesem Grund hat ein Objekt auch eine einfache Tabelle properties .
Während der erste ( properties_table ) ein Array von Zeigern ist, ist letzterer ein einfacher Schlüssel = & gt; Wertetabelle.
Na und? Nun, da properties_table nur Zeiger enthält (die eine feste Größe haben), werden sie in einem einfachen Array gespeichert, und die Zeiger werden mit ihren jeweiligen Offsets abgerufen. Die Offsets werden in einer weiteren HashTable gespeichert: was der ce->properties_info Zeiger ist.

Wie bwoebi in den Kommentaren auf mich hingewiesen hat: Die Versetzung (HashTable-Lookup) ist eine lineare Operation im Worst-Case (O (n)) und vordefinierte Property-Lookups sind komplexe Operationen mit konstanter Zeit (O (1)). Dynamische Eigenschaften benötigen andererseits eine andere HashTable-Suche, eine Worst-Case-lineare Operation (O (n)). Dies bedeutet, dass der Zugriff auf eine dynamische Eigenschaft im Durchschnitt etwa doppelt so lang ist. Autoren der Wikipedia können > Zeit-Komplexität jedoch viel besser erklären als ich kann p>

Zunächst scheinen Zugriffsmodifizierer irrelevant zu sein. Wenn Sie fortfahren, werden Sie schnell feststellen, dass Sie manchmal nicht das Risiko eingehen wollen, dass eine Eigenschaft eines Objekts durch etwas Code verändert wird. Das ist, wenn Sie den Wert von private sehen.
Wenn ein Objekt ein anderes Objekt enthält, das alle möglichen Einstellungen enthält, auf die sich Ihr Code beispielsweise stützt, verwenden Sie wahrscheinlich eine Getter-Methode, um von außen auf diese Einstellungen zuzugreifen, aber Sie werden diese tatsächliche Eigenschaft gut versteckt lassen mit private .

Wenn Sie im weiteren Verlauf Datenmodelle und eine Serviceschicht zu Ihrem Projekt hinzufügen, gibt es eine gute Änderung. Sie schreiben eine (abstrakte) Elternklasse, wenn auch nur für Typhinweis.
Wenn diese Dienstinstanzen etwas wie eine config-Eigenschaft enthalten, definieren Sie diesen Getter wahrscheinlich in der übergeordneten Klasse (um sie nur einmal zu definieren). private bedeutet, dass nur die aktuelle Klasse Zugriff auf eine Eigenschaft hat. Da Sie jedoch keine Instanz des übergeordneten Elements verwenden möchten, sondern eine Instanz des untergeordneten Elements, werden Sie dies tun Sehen Sie, warum protected auch im Umgang mit größeren Projekten von unschätzbarem Wert ist.

Soweit temporäre Variablen betroffen sind, sei es in Methoden, Funktionen oder anderswo, haben Sie nicht, sie vorher zu deklarieren, außer in bestimmten Fällen Arrays:

%Vor%

Ist vollkommen gültig und würde nicht besser funktionieren, wenn Sie

schreiben würden %Vor%

Allerdings ist es nicht ungewöhnlich, so etwas zu sehen:

%Vor%

Dieser Code beruht darauf, dass PHP so freundlich ist, ein Array zu erstellen, und weist es $return zu, wenn die $return[] = rand(); -Anweisung erreicht ist. PHP wird dies tun, aber wenn Sie Ihre Ini auf E_STRICT | E_ALL setzen, werden Sie feststellen, dass dies nicht geschieht, ohne sich darüber zu beschweren. Wenn Sie 0 an die Methode übergeben, wird das Array nicht erstellt, und PHP meldet sich auch, wenn es die return $return; -Anweisung erreicht: nicht deklarierte Variable . Es ist nicht nur unordentlich, es verlangsamt auch Sie! Sie sollten besser $return als ein Array am oberen Rand des Bereichs deklarieren:

%Vor%

Um auf der sicheren Seite zu sein, würde ich auch den Argumenttyp überprüfen:

%Vor%     
Elias Van Ootegem 17.07.2013 09:41
quelle
3

In den meisten, wenn nicht allen Fällen: ja .

Wenn es sich bei den Variablen um Klasseneigenschaften handelt, sollten unbedingt vor der Verwendung deklariert werden

Wenn die Variable für eine Funktion lokal ist, deklarieren Sie sie in dieser Funktion, bevor Sie sie verwenden. Funktionsvariablen beschränken sich auf den Gültigkeitsbereich der Funktion (lokale Variablen). Sie müssen nicht vor der Verwendung deklariert werden, aber es ist eine gute Methode, dies zu tun, und es wird eine Warnmeldung los, wenn Sie dies tun. Wenn sie nirgendwo anders verwendet werden, sollten sie nicht sein,

    
Bojangles 17.07.2013 09:40
quelle
2

Wenn Sie es im Kontext der gesamten Klasse verwenden, dann yes , sollten Sie Ihre Variable als Mitglied der Klasse definieren.

Wenn Sie jedoch über eine lokale Variable im Kontext einer einzelnen Funktion sprechen und die Variable nicht an anderer Stelle verwendet werden muss (oder nicht zurückgegeben wird), dann no.

Im Wesentlichen müssen Sie die Wichtigkeit und den Umfang Ihrer Variablen bestimmen, bevor Sie entscheiden, ob Sie sie zu einer Klasseneigenschaft machen wollen oder nicht.

Zum Beispiel:

%Vor%     
Rudi Visser 17.07.2013 09:39
quelle

Tags und Links