Bug oder Feature: Static in Methoden
Moin,
Folgendes kleine Skript:
$gemuese=3Darray("Kartoffeln","Karotten","Mais");
$obst=3Darray("=C4pfel","Birnen","Ananas");
$gemueseobjekt=3Dnew test($gemuese);
echo "<br/>".$gemueseobjekt->fetch();
$obstobjekt=3Dnew test($obst);
echo "<br/>".$obstobjekt->fetch();
class test{
var $data=3Darray();
function test($data){
$this->data=3D$data;
}
function fetch(){
static $pointer=3D0;
if( isset($this->data[$pointer])) {
return $this->data[$pointer++];
} else {
$pointer=3D0;
return false;
}
}
}
Liefert als Ergebnis:
Kartoffeln
Birnen
Warum wird nach new... die statische Variable in der Funktion fetch()
nicht zurückgesetzt?
Danke für Hilfe
Gruß
Anne
Re: Bug oder Feature: Static in Methoden
Anne Kaeppes wrote:
> $gemuese=array("Kartoffeln","Karotten","Mais");
> $obst=array("Äpfel","Birnen","Ananas");
> $gemueseobjekt=new test($gemuese);
> echo "<br/>".$gemueseobjekt->fetch();
> $obstobjekt=new test($obst);
> echo "<br/>".$obstobjekt->fetch();
>
> class test{
> var $data=array();
>
> function test($data){
> $this->data=$data;
> }
>
> function fetch(){
> static $pointer=0;
> if( isset($this->data[$pointer])) {
> return $this->data[$pointer++];
> } else {
> $pointer=0;
> return false;
> }
> }
> }
>
>
> Liefert als Ergebnis:
>
> Kartoffeln
> Birnen
So sollte es sein. Das ist korrekt.
> Warum wird nach new... die statische Variable in der Funktion fetch()
> nicht zurückgesetzt?
weil static $varname=value; nur ausgeführt wird wenn Svarname noch nicht
im statischen Kontext existiert.
Mach dannach ein $varname = 0; und alles ist im gruenen Bereich.
MfG, Ulf
Re: Bug oder Feature: Static in Methoden
Anne Kaeppes schrieb:
> Warum wird nach new... die statische Variable in der Funktion fetch()
> nicht zurückgesetzt?
Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
durchdachten Implementation zu sein. Semantisch korrekt wäre das von di=
r
erwartete Verhalten.
Zur Lösung: Verwende statt der statischen Variablen innerhalb der
Methode eine im Klassenraum. Die kannst du dann mit dem Setter für neue=
Daten passend initialisieren. Das ist auch generell die bessere Lösung,=
weil sie durch die Sichtbarkeit des Pointers für andere Methoden
zusätzliche Möglichkeiten eröffnet.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Bug oder Feature: Static in Methoden
Niels Braczek wrote:
> Anne Kaeppes schrieb:
>
>> Warum wird nach new... die statische Variable in der Funktion fetch()
>> nicht zurückgesetzt?
>
> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
> durchdachten Implementation zu sein. Semantisch korrekt wäre das von dir
> erwartete Verhalten.
Jetzt würde ich gerne wissen wieso das nicht durchdacht sein soll.
Mal abgesehen davon, dass ich zwar tendenziell bei vielen Features die
aus der Zeit vor PHP 5 stammen auch diesen Verdacht habe, finde ich
dieses Verhalten zwar nicht unbedingt intuitiv aber sinnvoll, damit
sich 1. statische Variablen in Funktionen sowohl im Objekt als auch
global gleich verhalten (ist ja schon sinnvoll einen Unterschied
zwischen in der Funktion und in der Klasse deklarierten Variablen zu
haben) und 2. keine Probleme mit der Rückwärtskompatibilität entstehen,
denn das ist (AFAIR) der sauberste Weg z.B. Singleton in PHP 4 zu benutzen.
regards,
Jens
Re: Bug oder Feature: Static in Methoden
Jens Himmelrath schrieb:
> Niels Braczek wrote:
>> Anne Kaeppes schrieb:
>>
>>> Warum wird nach new... die statische Variable in der Funktion fetch()=
>>> nicht zurückgesetzt?
>>
>> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
>> durchdachten Implementation zu sein. Semantisch korrekt wäre das von=
dir
>> erwartete Verhalten.
>
> Jetzt würde ich gerne wissen wieso das nicht durchdacht sein soll.
Weil bei einer *neuen Instanz* ein jungfräuliches Objekt zu entstehen
hat. Irgendwelche automagischen Bande zu zufällig bereits instantiierte=
n
Objekten sorgen für nur schwer bis gar nicht nachvollziehbares
Verhalten. Mit "new" wird schließlich ein neues Objekt erzeugt und nich=
t
eine Kopie von einem zufällig schon im Speicher befindlichen Objekt.
> denn das ist (AFAIR) der sauberste Weg z.B. Singleton in PHP 4 zu benut=
zen.
Nein; Singletons werden über eine statische Methode erzeugt und nicht
über ein instanziiertes Objekt. Das ist etwas völlig anderes.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Bug oder Feature: Static in Methoden
On Sat, 11 Aug 2007 08:56:29 +0200 Niels Braczek wrote:
> >> das scheint Absicht und eine Folge einer wenig durchdachten
> >> Implementation zu sein. Semantisch korrekt wäre das von dir
> >> erwartete Verhalten.
> > Jetzt würde ich gerne wissen wieso das nicht durchdacht sein soll.
> Weil bei einer *neuen Instanz* ein jungfräuliches Objekt zu
> entstehen hat.
Das ist wohl primaer eine Philosophiefrage. Sieht man sich die
PHP-Definition einer statischen Variable an, dann liest man:
| A static variable exists only in a local function scope, but
| it does not lose its value when program execution leaves this
| scope.
Nun wird aber die _Methode_ einer Klasse keineswegs fuer jedes
angelegte Objekt dupliziert, daher ist das local scope auch bei
jedem Aufruf das gleiche. Ich haette genau dieses Verhalten
erwartet.
_Sinnvoll_ fuer eine Anwendung ist das natuerlich weniger, weswegen
eine Klassenvariable fuer den gewuenschten Zweck auch eindeutig zu
bevorzugen ist.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Steile Kellen will Deutschland: Stefan!
(Sloganizer)
Re: Bug oder Feature: Static in Methoden
Niels Braczek wrote:
> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
> durchdachten Implementation zu sein.
Nur mal so nebenbei. Das was ich zum Thema geantwortet habe wurde vor
nen paar Jahren von Derick in der PHP-Mailinglist gesagt. Offensichtlich
bist Du damit nicht einverstanden, sonst hätteste nicht was anderes
geschrieben. Allerdings erschließt sich mir dessen Logik besser als Deine.
Getestet hab ichs noch nie, da ich ja bekanntlich kein PHP4 nutze.
MfG, Ulf
Re: Bug oder Feature: Static in Methoden
Niels Braczek schrieb:
> Anne Kaeppes schrieb:
>
>> Warum wird nach new... die statische Variable in der Funktion fetch()
>> nicht zurückgesetzt?
>
> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
> durchdachten Implementation zu sein.
Dann haben wohl 98% aller Programmiersprachen eine "wenig durchdachte
Implementation" oder besser ein wenig durchdachtes Konzept, denn bei all
diesen Sprachen ist genau dieses Verhalten von statischen Variablen per
Sprachdefinition festgelegt.
Gruß. Claus
Re: Bug oder Feature: Static in Methoden
Stefan Froehlich schrieb:
> On Sat, 11 Aug 2007 08:56:29 +0200 Niels Braczek wrote:
>> Weil bei einer *neuen Instanz* ein jungfräuliches Objekt zu
>> entstehen hat.
>
> Das ist wohl primaer eine Philosophiefrage. Sieht man sich die
> PHP-Definition einer statischen Variable an, dann liest man:
>
> | A static variable exists only in a local function scope, but
> | it does not lose its value when program execution leaves this
> | scope.
Deshalb sehe ich darin ja keinen Bug, sondern nur[tm] ein unglückliches=
Design.
> Nun wird aber die _Methode_ einer Klasse keineswegs fuer jedes
> angelegte Objekt dupliziert, daher ist das local scope auch bei
> jedem Aufruf das gleiche. Ich haette genau dieses Verhalten
> erwartet.
Die Nicht-Duplizierung ist IMHO eine Frage der technischen
Implementierung, nicht der Semantik. Ich erwarte bei einer neuen Instanz
frische (virtuelle Kopien der) Methoden mit eigenem Scope.
> _Sinnvoll_ fuer eine Anwendung ist das natuerlich weniger, weswegen
> eine Klassenvariable fuer den gewuenschten Zweck auch eindeutig zu
> bevorzugen ist.
Das ist auf jeden Fall die saubere und problemlosere Lösung.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Bug oder Feature: Static in Methoden
Ulf Kadner schrieb:
> Niels Braczek wrote:
>
>> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
>> durchdachten Implementation zu sein.
>
> Nur mal so nebenbei. Das was ich zum Thema geantwortet habe wurde vor
> nen paar Jahren von Derick in der PHP-Mailinglist gesagt. Offensichtlic=
h
> bist Du damit nicht einverstanden, sonst hätteste nicht was anderes
> geschrieben. Allerdings erschließt sich mir dessen Logik besser als D=
eine.
Ich halte das deswegen für unglücklich, weil kein sauber definierter
Anfangszustand existiert. Mir ist das selber nie aufgefallen, weil ich
für den Fall des OP immer Klassenvariablen benutze; statische Variablen=
kommen bei mir nur in statischen Methoden vor - dann ergibt sich das
Problem gar nicht erst. Anders sollte man wohl auch nicht arbeiten.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Bug oder Feature: Static in Methoden
Claus Reibenstein schrieb:
> Niels Braczek schrieb:
>> Anne Kaeppes schrieb:
>>
>>> Warum wird nach new... die statische Variable in der Funktion fetch()=
>>> nicht zurückgesetzt?
>>
>> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
>> durchdachten Implementation zu sein.
>
> Dann haben wohl 98% aller Programmiersprachen eine "wenig durchdachte
> Implementation" oder besser ein wenig durchdachtes Konzept, denn bei al=
l
> diesen Sprachen ist genau dieses Verhalten von statischen Variablen per=
> Sprachdefinition festgelegt.
Zum Glück sagte ich "scheint"... Als ich darüber nachsann, warum ich =
nie
auf dieses Problem gestoßen bin, kam ich zu dem Schluss, dass eh keine
statischen Variablen in nicht-statischen Methoden braucht/haben will.
Offensichtlich erschließt sich das implementierte Verhalten vielen im
Gegensatz zu mir intuitiv - daher kann es dann wohl doch nicht so falsch
sein.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Bug oder Feature: Static in Methoden
On Sat, 11 Aug 2007 16:56:46 +0200 Niels Braczek wrote:
> Zum Glück sagte ich "scheint"... Als ich darüber nachsann, warum ich
> nie auf dieses Problem gestoßen bin, kam ich zu dem Schluss, dass eh
> keine statischen Variablen in nicht-statischen Methoden braucht/haben
> will.
Ich glaube auch, der Kernpunkt ist, dass "static" im Zusammenhang
mit Klassen und nicht-statischen Methoden einfach keinen rechten
Sinn ergibt. Ob man das aus der Sprachdefinition resultierende Verhalten
als intuitiv betrachtet, oder nicht, liegt also wohl eher am
persoenlichen Zugang zur Materie.
Servus,
Stefan>
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Die letzte Verführung! Stefan, damit alles gelingt!
(Sloganizer)
Re: Bug oder Feature: Static in Methoden
Niels Braczek wrote:
> Jens Himmelrath schrieb:
>> Niels Braczek wrote:
>>> Anne Kaeppes schrieb:
>>>
>>>> Warum wird nach new... die statische Variable in der Funktion fetch()
>>>> nicht zurückgesetzt?
>>> Keine Ahnung, aber das scheint Absicht und eine Folge einer wenig
>>> durchdachten Implementation zu sein. Semantisch korrekt wäre das von dir
>>> erwartete Verhalten.
>> Jetzt würde ich gerne wissen wieso das nicht durchdacht sein soll.
>
> Weil bei einer *neuen Instanz* ein jungfräuliches Objekt zu entstehen
> hat.
Steht das jetzt im Grundgesetz?
> Irgendwelche automagischen Bande zu zufällig bereits instantiierten
> Objekten sorgen für nur schwer bis gar nicht nachvollziehbares
> Verhalten.
Lies mein Posting noch mal und guck dir die Unterscheide zwischen PHP 4
und 5 an.
Und wie was zu sein hat und was nachvollziehbar ist, ist Ansichtssache.
> Mit "new" wird schließlich ein neues Objekt erzeugt und nicht
> eine Kopie von einem zufällig schon im Speicher befindlichen Objekt.
Richtig: Unterschied statische Objektvariable und statische
Funktionsvariable.
>
>> denn das ist (AFAIR) der sauberste Weg z.B. Singleton in PHP 4 zu benutzen.
>
> Nein; Singletons werden über eine statische Methode erzeugt und nicht
> über ein instanziiertes Objekt. Das ist etwas völlig anderes.
Ah, du findest es also intuitiver/besser wenn sich "static" je nachdem
wie die entsprechende Funktion aufgerufen wird jeweils anders verhält?
Wer sagt dir denn in PHP4 ob die Funktion statisch ist oder nicht?
regards,
Jens
Re: Bug oder Feature: Static in Methoden
Stefan Froehlich schrieb:
> Ich glaube auch, der Kernpunkt ist, dass "static" im Zusammenhang
> mit Klassen und nicht-statischen Methoden einfach keinen rechten
> Sinn ergibt. Ob man das aus der Sprachdefinition resultierende Verhalte=
n
> als intuitiv betrachtet, oder nicht, liegt also wohl eher am
> persoenlichen Zugang zur Materie.
ACK. Und wenn es auch nicht zu meinem "persönlichen Zugang" passt, kann=
ich doch gut damit leben.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------