Einzelnen Beitrag anzeigen
  #3  
Alt 23.08.2005, 23:57:37
Benutzerbild von Matt
Matt Matt ist offline
Member
 
Registriert seit: Mar 2002
Ort: Port 80, localhost-city, 127/0/0/1
Beiträge: 878
AW: php4 - php5 functionsaufruf!

Nunja, eines mal vorweg: PHP5 macht das absolut richtig, PHP4 macht (im eigentlichen sinne betrachtet) mist.

Der Unterschied ist folgender: Objektorientiertes Programmieren bedeuted ja nicht das schreiben von klassen im eigentlichen sinne, sondern das arbeiten mit Objekten im weitesten sinne. Eine Klasse ist sozusagen ein Bauplan für Objekte. Wenn du ein Auto bauen kannst, warum solltest du dann nicht auch zwei bauen können (falls du sie benötigst)

Wenn du ein Objekt erzeugen willst, geschieht das folgendermaßen:

$obj=new MyClass();

willst du nun die Methode foo von $obj aufrufen, geschieht dies über

$obj->foo();

hierbei wird die methode foo des Objektes $obj aufgerufen. Alles was diese macht, wirkt sich nur auf die klasse selbst aus. Ändert diese methode also beispielsweise die Variable $bar die in dieser klasse ist, wirkt sich das auf andere Objekte nicht aus.

Wenn du nun eine Methode so aufrufst (=statischer aufruf):

MyClass::foo()

dann rufst du diese methode nur auf, ohne ein Objekt erstellt zu haben - von dieser klasse gibt es praktisch nur eine version. wenn du da etwas änderst, ändert sich das überall, wo diese klasse verwendet wird.

Das ist alles ganz schön, beantwortet deine frage aber nicht... noch nicht.

Denn jetzt kommt es: stell dir vor, du würdest paralell mit statischen aufrufen auch gleichzeitig mit objekten arbeiten. Die änderung, die du an Objekten machst, wirkt sich nur auf sich selbst aus, die änderungen mit statischen aufrufen... auf was wirken die sich jetzt aus?

Daher müssen statische Aufrufe gekennzeichnet werden, indem du vor den funktionsnamen bzw. variablennamen ein "static" setzt. nun weiß PHP dass diese methode/variable für alle Objekte gleich ist - sie muss also nur einmal existieren. Trotzdem können alle Objekte auf diese statischen werte zugreifen. Wenn sie das tun, gilt für sie das selbe - die änderung betrifft alle Objekte des typs.
Anders herum, kannst du in einer statischen methode keine nicht statischen variablen ändern bzw. nicht statischen methoden aufrufen. (welche wären denn gemeint - für jedes objekt existiert eine version davon!)

Diese problematik war ein widerspruch in sich, die PHP in version 4.0 absolut ignoriert hat. Mit dem neuen Modell lassen sich allerdings sehr viele dinge realisieren, die davor nicht vernünftig machbar waren. Generell ist das initalisieren von Klassen aber empfehlenswert. Nur mit statischen Klassen zu arbeiten ist sinnlos - man könnte genausogut ohne klassen und mit globalen variablen arbeiten - es wäre (fast) das selbe, nur man würde PHP die Mühe des Parsens von Klassen ersparen.

so ich hoffe, es ist halbwegs rübergekommen, was ich erklären wollte.
Mit Zitat antworten