Frage php statische Eigenschaft


Ich habe zwei Code - Snippets (bezüglich der static Schlüsselwort), von dem ich erwarte, dass sie dieselbe Ausgabe haben, aber tatsächlich sind die Ausgaben unterschiedlich.

Die Frage ist warum?

Auszug 1

class base
{
    public static $var = 1;
}

class sub extends base
{
    public static $var = 2;
}

echo base::$var; // Outputs 1

1

Auszug 2

class base2
{
    public static $var2 = 1;
}

class sub2 extends base2
{
}

sub2::$var2 = 2;
echo base2::$var2; // Outputs 2

2


8
2018-02-18 05:27


Ursprung


Antworten:


Ich möchte einen weiteren Punkt hinzufügen.

STATISCHE Variable sind nicht einer bestimmten Instanz / einem bestimmten Objekt einer Klasse zugeordnet. Daher ändern Sie die Variable mit der Elternklassenreferenz oder der Kindklassenreferenz, die gleiche Kopie wird geändert.

Abgesehen davon, dass Sie Public Static als Global verstehen, verstehen Sie bitte, dass es nicht mit einer bestimmten Instanz verknüpft ist. Daher wird bei jeder Klassenhierarchie-Referenz, die Sie eine statische Variable aktualisieren, der gleiche Speicherort aktualisiert.

-

Vinod


13
2018-02-18 05:43



Public static variable verhält sich wie global Variable.

Als der Umfang von public static variable Lügen Sie global, können Sie sicherstellen, dass alle Änderungen an der global variable kann über das Programm gesehen werden. Dieses Konzept können Sie in Ihrem Beispielprogramm analysieren ....

Bitte schau rein Statische Variablenvererbung.


7
2018-02-18 05:32



Da die Klasse sub2 nicht über var2 verfügt, nimmt sie den Wert der Klasse base2.So, wenn Sie einen neuen Wert zugewiesen haben sub2::$var2 = 2; es hat sich zu einem neuen Wert geändert.

Im ersten Code haben Sie das in Ihrer erweiterten Klasse überschrieben. Beide Variablen haben einen Gültigkeitsbereich innerhalb ihrer jeweiligen Klassen.


0
2018-02-18 05:40



Wenn Sie eine statische Variable an eine Unterklasse übergeben, wird diese Variable gemeinsam verwendet (in beiden Klassen hat sie immer denselben Wert). Wenn Sie die statische Variable in einer Unterklasse überschreiben, ist dies eine neue statische Variable, die unabhängig von der statischen Variable des übergeordneten Elements ist.

Im Auszug 1  base::var und sub::var habe unterschiedliche Speicherzuweisungen, weil du definiert hast $var = 2; in der Klasse sub.

Im Auszug 2  base::var und sub::var haben die gleiche Speicherzuweisung, weil Sie nicht angegeben haben $var2 in der Klasse sub2.

Deshalb base:var ändert sich nicht. Es würde sich auch nicht ändern, wenn du dich änderst $var von sub Klasse später wie folgt:

class base
{
    public static $var = 1;
}

class sub extends base
{
    public static $var = 2;
}
sub::var = 3
echo base::var; // Outputs 1

0
2017-10-14 07:56