Im Kontext einer Klasse befinden sich statische Variablen im Bereich des Klassenbereichs (nicht des Objekts), aber im Gegensatz zu einer Konstante können ihre Werte geändert werden.
classClassName{static $my_var =10;/* defaults to public unless otherwise specified */const MY_CONST =5;}
echo ClassName::$my_var;// returns 10
echo ClassName::MY_CONST;// returns 5ClassName::$my_var =20;// now equals 20ClassName::MY_CONST =20;// error! won't work.
Öffentlich, geschützt und privat sind in Bezug auf Konstanten (die immer öffentlich sind) irrelevant. Sie sind nur für Klassenvariablen nützlich, einschließlich statischer Variablen.
Auf öffentliche statische Variablen kann überall über die Variable ClassName :: $ zugegriffen werden.
Auf geschützte statische Variablen kann von der definierenden Klasse oder von erweiterten Klassen über die Variable ClassName :: $ zugegriffen werden.
Auf private statische Variablen kann nur die definierende Klasse über die Variable ClassName :: $ zugreifen.
Ich bevorzuge die Verwendung self::$variablefür geschützte statische und private statische Variablen, da ich den genannten Klassennamen lieber nur einmal in sich behalten möchte, was ganz am Anfang der Klasse steht.
Lukman
3
Ja, guter Punkt, ich habe es versäumt zu erwähnen, dass das Schlüsselwort self verwendet werden kann, wenn innerhalb der Klasse selbst referenziert wird. Die oben angegebenen Beispiele wurden außerhalb der Klassendefinition durchgeführt. In diesem Fall muss der Klassenname verwendet werden.
Matt Huggins
Tolle Antwort, sehr nah am Akzeptieren. Könnten Sie bitte einen Punkt klarstellen: "Öffentlich, geschützt und privat sind in Bezug auf Konstanten irrelevant" - Warum? Sind consts standardmäßig alle öffentlich? alles privat?
Chris Jacob
1
braucht eine statische var keine $? static $my_var = 10;in der Definition
Daniel W.
Alter Thread, aber ich möchte etwas hinzufügen: Schauen Sie sich php.net/manual/en/… an , in dem erklärt wird, dass staticVariablen auch in Singletons und rekursiven Funktionen sehr nützlich sind. Weil Sie den Wert ändern können, aber die Variable nur einmal initialisiert wird. Weitere Informationen zum Erstellen eines Singletons finden Sie unter stackoverflow.com/questions/203336/… . Für mich sind dies einige Situationen, in denen ich statische Variablen bevorzuge.
Erik van de Ven
20
Ein letzter Punkt, der gemacht werden sollte, ist, dass eine Konstante immer statisch und öffentlich ist. Dies bedeutet, dass Sie innerhalb der Klasse wie folgt auf die Konstante zugreifen können:
Ist diese Erklärung wahr? dass "const ist immer statisch und öffentlich"?
apil.tamang
7
Das stimmt nicht mehr. Ab PHP 7.1 können Klassenkonstanten als privat oder geschützt deklariert werden. Siehe RFC
DisgruntledGoat
11
Konstante ist nur eine Konstante, dh Sie können ihren Wert nach dem Deklarieren nicht ändern.
Auf statische Variablen kann zugegriffen werden, ohne eine Instanz einer Klasse zu erstellen, und daher von allen Instanzen einer Klasse gemeinsam genutzt werden.
Es kann auch eine statische lokale Variable in einer Funktion geben, die nur einmal deklariert wird (bei der ersten Ausführung einer Funktion) und deren Wert zwischen Funktionsaufrufen speichern kann. Beispiel:
function foo(){static $numOfCalls =0;
$numOfCalls++;print("this function has been executed ". $numOfCalls ." times");}
Wenn Sie über Klassenvererbung sprechen, können Sie mithilfe von selfund staticSchlüsselwörtern zwischen Konstanten oder Variablen in verschiedenen Bereichen unterscheiden . Überprüfen Sie dieses Beispiel, das zeigt, wie Sie auf was zugreifen können:
classPerson{static $type ='person';const TYPE ='person';staticpublicfunction getType(){
var_dump(self::TYPE);
var_dump(static::TYPE);
var_dump(self::$type);
var_dump(static::$type);}}classPirateextendsPerson{static $type ='pirate';const TYPE ='pirate';}
Mit anderen Worten self::bezieht sich auf die statische Eigenschaft und Konstante aus demselben Bereich, in dem sie aufgerufen wird (in diesem Fall die PersonOberklasse), während static::auf die Eigenschaft und Konstante aus dem Bereich zur Laufzeit zugegriffen wird (in diesem Fall also in der PirateUnterklasse).
Wenn Sie eine Klassenmethode oder -eigenschaft als statisch deklarieren, können Sie auf sie zugreifen, ohne dass eine Instanziierung der Klasse erforderlich ist.
Eine Klassenkonstante ist wie eine normale Konstante und kann zur Laufzeit nicht geändert werden. Dies ist auch der einzige Grund, warum Sie const jemals verwenden werden.
Privat, öffentlich und geschützt sind Zugriffsmodifikatoren, die beschreiben, wer auf welchen Parameter / welche Methode zugreifen kann.
Öffentlich bedeutet, dass alle anderen Objekte Zugriff erhalten. Privat bedeutet, dass nur die instanziierte Klasse Zugriff erhält. Geschützt bedeutet, dass die instanziierte Klasse und die abgeleiteten Klassen Zugriff erhalten.
Hier sind die Dinge, die ich bisher über statische Elemente, konstante Variablen und Zugriffsmodifikatoren (privat, öffentlich und geschützt) gelernt habe.
Konstante
Definition
Wie der Name schon sagt, können Werte einer konstanten Variablen nicht geändert werden. Konstanten unterscheiden sich von normalen Variablen darin, dass Sie das $ -Symbol nicht zum Deklarieren oder Verwenden verwenden.
Der Wert muss ein konstanter Ausdruck sein, nicht (zum Beispiel) eine Variable, eine Eigenschaft, ein Ergebnis einer mathematischen Operation oder ein Funktionsaufruf.
Hinweis: Der Wert der Variablen darf kein Schlüsselwort sein (z. B. self, parent und static).
Deklarieren einer Konstante in PHP
<?php
class constantExample{const CONSTANT ='constant value';//constant}?>
Der Bereich von Constant ist global und kann über ein self-Schlüsselwort aufgerufen werden
<?php
classMyClass{const CONSTANT ='constant value';function showConstant(){
echo self::CONSTANT ."\n";}}
echo MyClass::CONSTANT ."\n";
$classname ="MyClass";
echo $classname::CONSTANT ."\n";// As of PHP 5.3.0
$class =newMyClass();
$class->showConstant();
echo $class::CONSTANT."\n";// As of PHP 5.3.0?>
Statisch
Definition
Das statische Schlüsselwort kann zum Deklarieren einer Klasse, einer Elementfunktion oder einer Variablen verwendet werden. Auf statische Elemente in einer Klasse, die global ist, kann auch mit einem Selbstschlüsselwort zugegriffen werden. Wenn Sie Klasseneigenschaften oder -methoden als statisch deklarieren, können Sie auf sie zugreifen, ohne dass eine Instanziierung der Klasse erforderlich ist . Auf eine als statisch deklarierte Eigenschaft kann mit einem instanziierten Klassenobjekt nicht zugegriffen werden (obwohl dies mit einer statischen Methode möglich ist). Wenn keine Sichtbarkeitserklärung (öffentlich, privat, geschützt) verwendet wird, wird die Eigenschaft oder Methode so behandelt, als ob sie als öffentlich deklariert worden wäre. Statische Methoden können ohne eine Instanz des erstellten Objekts aufgerufen werden.
Hinweis: Die Pseudovariable $ this ist in der als statisch deklarierten Methode nicht verfügbar. Auf statische Eigenschaften kann mit dem Pfeiloperator -> nicht über das Objekt zugegriffen werden
Ab PHP 5.3.0 ist es möglich, die Klasse mithilfe einer Variablen zu referenzieren. Der Wert der> Variablen kann kein Schlüsselwort sein (z. B. self, parent und static).
Beispiel für statische Eigenschaften
<?php
classFoo{publicstatic $my_static ='foo';//static variable publicstaticfunction staticValue(){//static function examplereturnself::$my_static;//return the static variable declared globally}}?>
Beispiel für den Zugriff auf statische Eigenschaften und Funktionen
Mit privaten, öffentlichen und geschützten Schlüsselwörtern können Sie den Zugriff auf die Mitglieder einer Klasse steuern. Als öffentlich deklarierte Klassenmitglieder können überall zugegriffen werden. Auf Mitglieder, die als geschützt deklariert wurden, kann nur innerhalb der Klasse selbst sowie von geerbten und übergeordneten Klassen zugegriffen werden. Als privat deklarierte Mitglieder dürfen nur von der Klasse aufgerufen werden, die das Mitglied definiert.
Beispiel
<?php
classExample{public $variable ='value';// variable declared as public protected $variable ='value'//variable declared as protectedprivate $variable ='value'//variable declared as privatepublicfunction functionName(){//public function//statements}protectedfunction functionName(){//protected function//statements}privatefunction functionName(){//private function//statements}}?>
Zugriff auf das Beispiel für öffentliche, private und geschützte Mitglieder
Auf öffentliche Variablen kann von außerhalb der Klasse oder innerhalb der Klasse zugegriffen und geändert werden. Sie können jedoch nur innerhalb der Klasse auf die privaten und geschützten Variablen und Funktionen zugreifen. Sie können den Wert von geschützten oder öffentlichen Mitgliedern außerhalb der Klasse nicht ändern.
<?php
classExample{public $pbVariable ='value';protected $protVariable ='value';private $privVariable ='value';publicfunction publicFun(){
echo $this->$pbVariable;//public variable
echo $this->$protVariable;//protected variable
echo $this->privVariable;//private variable}privatefunctionPrivateFun(){//some statements}protectedfunctionProtectedFun(){//some statements}}
$inst =newExample();
$inst->pbVariable ='AnotherVariable';//public variable modifed from outside
echo $inst->pbVariable;//print the value of the public variable
$inst->protVariable ='var';//you can't do this with protected variable
echo $inst->privVariable;// This statement won't work , because variable is limited to private
$inst->publicFun();// this will print the values inside the function, Because the function is declared as a public function
$inst->PrivateFun();//this one won't work (private)
$inst->ProtectedFun();//this one won't work as well (protected)?>
Weitere Informationen finden Sie in dieser PHP-Dokumentation zur Sichtbarkeit. Sichtbarkeit Php Doc
self::$variable
für geschützte statische und private statische Variablen, da ich den genannten Klassennamen lieber nur einmal in sich behalten möchte, was ganz am Anfang der Klasse steht.$
?static $my_var = 10;
in der Definitionstatic
Variablen auch in Singletons und rekursiven Funktionen sehr nützlich sind. Weil Sie den Wert ändern können, aber die Variable nur einmal initialisiert wird. Weitere Informationen zum Erstellen eines Singletons finden Sie unter stackoverflow.com/questions/203336/… . Für mich sind dies einige Situationen, in denen ich statische Variablen bevorzuge.Ein letzter Punkt, der gemacht werden sollte, ist, dass eine Konstante immer statisch und öffentlich ist. Dies bedeutet, dass Sie innerhalb der Klasse wie folgt auf die Konstante zugreifen können:
Von außerhalb der Klasse würden Sie wie folgt darauf zugreifen:
quelle
Konstante ist nur eine Konstante, dh Sie können ihren Wert nach dem Deklarieren nicht ändern.
Auf statische Variablen kann zugegriffen werden, ohne eine Instanz einer Klasse zu erstellen, und daher von allen Instanzen einer Klasse gemeinsam genutzt werden.
Es kann auch eine statische lokale Variable in einer Funktion geben, die nur einmal deklariert wird (bei der ersten Ausführung einer Funktion) und deren Wert zwischen Funktionsaufrufen speichern kann. Beispiel:
quelle
Wenn Sie über Klassenvererbung sprechen, können Sie mithilfe von
self
undstatic
Schlüsselwörtern zwischen Konstanten oder Variablen in verschiedenen Bereichen unterscheiden . Überprüfen Sie dieses Beispiel, das zeigt, wie Sie auf was zugreifen können:Und dann mache:
oder:
Ausgabe:
Mit anderen Worten
self::
bezieht sich auf die statische Eigenschaft und Konstante aus demselben Bereich, in dem sie aufgerufen wird (in diesem Fall diePerson
Oberklasse), währendstatic::
auf die Eigenschaft und Konstante aus dem Bereich zur Laufzeit zugegriffen wird (in diesem Fall also in derPirate
Unterklasse).Weitere Informationen zur späten statischen Bindung finden Sie hier auf php.net .
Überprüfen Sie auch die Antwort auf eine andere Frage hier und hier .
quelle
Wenn Sie eine Klassenmethode oder -eigenschaft als statisch deklarieren, können Sie auf sie zugreifen, ohne dass eine Instanziierung der Klasse erforderlich ist.
Eine Klassenkonstante ist wie eine normale Konstante und kann zur Laufzeit nicht geändert werden. Dies ist auch der einzige Grund, warum Sie const jemals verwenden werden.
Privat, öffentlich und geschützt sind Zugriffsmodifikatoren, die beschreiben, wer auf welchen Parameter / welche Methode zugreifen kann.
Öffentlich bedeutet, dass alle anderen Objekte Zugriff erhalten. Privat bedeutet, dass nur die instanziierte Klasse Zugriff erhält. Geschützt bedeutet, dass die instanziierte Klasse und die abgeleiteten Klassen Zugriff erhalten.
quelle
Hier sind die Dinge, die ich bisher über statische Elemente, konstante Variablen und Zugriffsmodifikatoren (privat, öffentlich und geschützt) gelernt habe. Konstante
Definition
Wie der Name schon sagt, können Werte einer konstanten Variablen nicht geändert werden. Konstanten unterscheiden sich von normalen Variablen darin, dass Sie das $ -Symbol nicht zum Deklarieren oder Verwenden verwenden.
Der Wert muss ein konstanter Ausdruck sein, nicht (zum Beispiel) eine Variable, eine Eigenschaft, ein Ergebnis einer mathematischen Operation oder ein Funktionsaufruf.
Deklarieren einer Konstante in PHP
Der Bereich von Constant ist global und kann über ein self-Schlüsselwort aufgerufen werden
Statisch
Definition
Das statische Schlüsselwort kann zum Deklarieren einer Klasse, einer Elementfunktion oder einer Variablen verwendet werden. Auf statische Elemente in einer Klasse, die global ist, kann auch mit einem Selbstschlüsselwort zugegriffen werden. Wenn Sie Klasseneigenschaften oder -methoden als statisch deklarieren, können Sie auf sie zugreifen, ohne dass eine Instanziierung der Klasse erforderlich ist . Auf eine als statisch deklarierte Eigenschaft kann mit einem instanziierten Klassenobjekt nicht zugegriffen werden (obwohl dies mit einer statischen Methode möglich ist). Wenn keine Sichtbarkeitserklärung (öffentlich, privat, geschützt) verwendet wird, wird die Eigenschaft oder Methode so behandelt, als ob sie als öffentlich deklariert worden wäre. Statische Methoden können ohne eine Instanz des erstellten Objekts aufgerufen werden.
Beispiel für statische Eigenschaften
Beispiel für den Zugriff auf statische Eigenschaften und Funktionen
Öffentlich, privat, geschützt (AKA-Zugriffsmodifikatoren)
Bevor Sie die folgende Definition lesen, lesen Sie diesen Artikel über Kapselung. Er wird Ihnen helfen, das Konzept besser zu verstehen
Link 1 Wikipedia
Tutorials zeigen Link zur Kapselung
Definition
Mit privaten, öffentlichen und geschützten Schlüsselwörtern können Sie den Zugriff auf die Mitglieder einer Klasse steuern. Als öffentlich deklarierte Klassenmitglieder können überall zugegriffen werden. Auf Mitglieder, die als geschützt deklariert wurden, kann nur innerhalb der Klasse selbst sowie von geerbten und übergeordneten Klassen zugegriffen werden. Als privat deklarierte Mitglieder dürfen nur von der Klasse aufgerufen werden, die das Mitglied definiert.
Beispiel
Zugriff auf das Beispiel für öffentliche, private und geschützte Mitglieder
Weitere Informationen finden Sie in dieser PHP-Dokumentation zur Sichtbarkeit. Sichtbarkeit Php Doc
Referenzen: php.net
Ich hoffe du hast das Konzept verstanden. Danke fürs Lesen :) :) Hab einen guten
quelle
Um es auf @Matt noch einmal zusammenzufassen:
Wenn die von Ihnen benötigte Eigenschaft nicht geändert werden soll, ist eine Konstante die richtige Wahl
Wenn die von Ihnen benötigte Eigenschaft geändert werden darf, verwenden Sie stattdessen static
Beispiel:
Bearbeiten: Es ist wichtig zu beachten, dass PHP 7.1.0 die Unterstützung für die Angabe der Sichtbarkeit von Klassenkonstanten eingeführt hat .
quelle