phpbar.de logo

Mailinglisten-Archive

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

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

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Mon Jan 16 18:22:04 CET 2006


Hallo Peter,

Am Montag, 16. Januar 2006 15:24 schrieb Lutz Zetzsche:
> Am Montag, 16. Januar 2006 14:44 schrieb Peter Bieling:
> > 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.)
>
> zunächst ein Link dazu für Java:
>
> http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_003.htm#Rxx
>365java06003040001CB1F038100
>
> Ansonsten kann ich das gerne für Dich mal mit Java ausprobieren. :-) Aber:
> Mich verwirrt nach wie vor Eure Diskussion. Warum sollte sich in einer
> Klasse eine static-Variable innerhalb einer Funktion anders verhalten, als
> außerhalb einer Funktion?
>
> Bei der Objektorientierten Programmierung steht doch das Objekt im
> Vordergrund, d.h. eine Klasse hat Attribute und Methoden. Hier ist keine
> Rede davon, daß eine Methode Attribute besäße. Klassenattribute gehören zur
> Klasse, niemals zu Methoden. Eine Methode kann ein Attribut verändern. Mehr
> nicht.
>
> Aus meiner Sicht müßte eine static-Variable in einer Klasse ohnehin
> außerhalb der Funktionen deklariert werden. Ich werde mal prüfen, ob das
> nicht der einzige, fehlerfreie Weg in Java ist.
>
> Ich gehe mal davon aus, daß die vermeintliche Dokumentationslücke, die wir
> da gesehen haben, deswegen existiert, weil es da nichts zu erklären gibt.
> Es gibt von der Logik her keine statischen Variablen, deren Geltungsbereich
> auf eine Methode in einer Klasse beschränkt ist. Diese Idee kann eigentlich
> nur zustandekommen, wenn prozedurale Ansätze mit objektorientierten
> vermischt werden bzw. prozedurale Programmierung 1:1 in
> objektiertorientierte übertragen wird. :-)

so. Ich habe mal schnell in NetBeans einen Test gemacht, wie Java sich 
verhält. :-)

1. Der Test hat voll bestätigt was ich hier oben geschrieben habe. In Java 
kannst Du Variablen ausschließlich im Rumpf der Klasse deklarieren, also 
nicht etwa in Methoden. Damit kommt bei Java das Problem gar nicht erst auf, 
was wir hier für PHP diskutieren.

2. Die static-Variable verhält sich folglich in Java genauso, wie Du es auch 
in PHP beobachtet hast.

Hier kurz die Testprogrammierung:

--------------- ANFANG - QUELLTEXT NewClass.java ---------------
/*
 * NewClass.java
 *
 * Created on 16. Januar 2006, 17:38
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication1;

/**
 *
 * @author lutz
 */
public class NewClass {
    
    public static int staticTest = 0;
    
    /** Creates a new instance of NewClass */
    public NewClass() {
        staticTest += 10;
    }
    
}
--------------- ENDE - QUELLTEXT NewClass.java ---------------

--------------- ANFANG - QUELLTEXT Main.java ---------------
/*
 * Main.java
 *
 * Created on 16. Januar 2006, 17:37
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication1;

import javaapplication1.NewClass;

/**
 *
 * @author lutz
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        NewClass staticTestObjekt1 = new NewClass();
        
System.out.println("staticTestObjekt1.staticTest="+staticTestObjekt1.staticTest);
        staticTestObjekt1 = null;
        
        NewClass staticTestObjekt2 = new NewClass();
        
System.out.println("staticTestObjekt2.staticTest="+staticTestObjekt2.staticTest);
        staticTestObjekt2 = null;

        System.out.println("NewClass.staticTest="+NewClass.staticTest);
    }
    
}
--------------- ENDE - QUELLTEXT Main.java ---------------

Wenn Main.class ausgeführt wird, werden nacheinander zwei Objekte der Klasse 
NewClass.class gebildet und anschließend der Inhalt der statischen Variable 
ausgegeben. Objekt 1 wird zerstört, bevor Objekt 2 gebildet wird. Nachdem 
auch das Objekt 2 zerstört ist, wird die Klassenvariable noch einmal 
ausgegeben. Sie hat dann immer noch ihren Inhalt.

Und so sieht die Ausgabe aus, wenn Main.class ausgeführt wird:

init:
deps-jar:
Compiling 1 source file to /home/lutz/JavaApplication1/build/classes
compile-single:
run-single:
staticTestObjekt1.staticTest=10
staticTestObjekt2.staticTest=20
NewClass.staticTest=20
BUILD SUCCESSFUL (total time: 0 seconds)

Ich denke, damit sind sämtliche Fragen beantwortet. :-)


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive