phpbar.de logo

Mailinglisten-Archive

[php] static in Methoden (PHP4) - Ist das so gedacht?

[php] static in Methoden (PHP4) - Ist das so gedacht?

Peter Bieling network at media-palette.de
Mon Jan 16 14:44:33 CET 2006


Hallo Matthias,

Matthias Stierli wrote:
>>>Ich frage mich ein wenig, was ihr von static denn anderes erwartet.
>>>Was wäre denn der Unterschied zwischen einer normalen Eigenschaft und
>>>einer static-Eigenschaft, wenn nicht eben genau dieses klassenglobale
>>>Verhalten?
>>
>>Eine Eigenschaft ist eben an das Objekt, die mit static definierte
>>Variable
>>an die Klasse gebunden.
> 
> Genau das habe ich ja geschrieben, mir ging es darum, ob das jemand anders
> sieht. Es gab in dieser Diskussion Leute, die über dieses Verhalten
> überrascht waren.

Also, mich hatte überrascht, dass sich Methoden verschiedener Objekte 
ihre static-Variablen teilen.
Selbst wenn man das Objekt zerstört und ein neues bildet, bleibt diese 
static-Variable erhalten, oder genauer gesagt: feiert Auferstehung.

Offenbar hat das auch einige Kommentatoren des Manuals überrascht, denn 
die haben extra darauf hingewiesen. Da es aber das gleiche Verhalten ist 
wie in C++, nehme ich inzwischen an, dass das so sein soll. (Vielleicht 
weiß jemand, wie es z.B. in Java oder anderen objektorientierten 
Sprachen gelöst ist.)

Static-Variablen in Funktionen kann man besonders dann brauchen, wenn 
man diese Funktionen rekursiv aufruft. Bei mir ging es darum, die 
Navigation für verschiedene Seiten einer Website aus einem Baum zu 
generieren. Dafür brauchte ich jedesmal ein "frisches" Objekt. Dabei hat 
es gestört, dass die static-Variablen nicht automatisch bei 0 anfingen, 
sondern aus längst vergangenen Objekten weitergezählt wurden.

> Ich schreibe ja, dass das Verhalten von PHP diesbezüglich seltsam ist, da
> es aus einer static-definierten Variable (ob das jetzt Sinn macht oder
> nicht) eine klassenglobale Variable macht, so jedenfalls verstand ich das
> zu Beginn.
> Mir ist schon klar, dass das keinen Sinn macht, aber das schrieb ich ja
> genau in meinem Beitrag, scheint mir als solltest du die Texte nicht zu
> stark überfliegen :)

Ich bin zwar nicht angesprochen, aber: obwohl ich Deine Beiträge genau 
gelesen habe, kann ich ebenfalls nicht genau nachvollziehen, was Du uns 
genau sagen willst. Vielleicht habe ich zu intensiv gelesen. ;-(

Mein Problem war bisher, den Sinn zu finden, warum sich verschiedene 
Objekte einer Klasse die static-Variablen teilen sollten. Aber mir 
dämmert es langsam.

Ein theoretisches Beispiel:
Klasse Kuehe mit den Objekten Alma, Berta, Cleo.
Die Methode ist add_liter($liter),
Innerhalb dieser Methode gibt es eine static $gesamtliter, zu der immer 
die $liter addiert werden. In diesem Fall werden alle Milcherträge 
sozusagen in einer gemeinsamen (Milchsee-)Variablen gesammelt.

Will ich nur die Erträge einer Kuh addieren, kann ich static nicht 
verwenden! Dafür brauche ich dann eine var $einzel_milch, auf die ich 
dann z.B. mit
$bertas_milch = Berta->get_milchmenge();
zugreifen kann.
Die gemeinsame static-Variable schafft quasi eine Verbindung zwischen 
den verschiedenen Objekten, ohne dass man mit (globalen) Variablen 
außerhalb der Objekte arbeiten muss.

So, und nun hoffe ich, dass mit dieser Milchmädchen-Klasse alle 
Klarheiten restlos beseitigt sind.
Viele Grüße

Peter

php::bar PHP Wiki   -   Listenarchive