Georok: Eine kurze Frage zu Klassen

Tag,

ich beschäftige mich gerade mit Klassen, aber etwas durchblicke ich noch nicht ganz.
Ich habe hier mal das Beispiel der PHP Doku:

<?php
class Cart
{
   var $items;  // Artikel in unserem Einkaufswagen

// Füge dem Einkaufswagen $num Artikel der Sorte $artnr zu

function add_item ($artnr, $num)
   {
       $this->items[$artnr] += $num;
   }

// Nimm $num Artikel von $artnr aus dem Einkaufswagen

function remove_item ($artnr, $num)
   {
       if ($this->items[$artnr] > $num) {
           $this->items[$artnr] -= $num;
           return true;
       } else {
           return false;
       }
   }
}
?>

Was funktioniert da wie? Wenn ich eine Klasse aufrufe, mache ich das ja immer mit new, oder?
In diesem Fall also:

$einkaufwagen = new Cart;

Läuft jetzt einfach alles in der Klasse ab, oder muss ich jede Funktion extra aufrufen? Und wozu sind diese Pfeile -> gut? Und hat $this eine spezielle Bedeutung?

Ich hoffe ihr könnt mir hier weiterhelfen.

  1. hi!

    also deine klasse kannst du eigentlich als "black-box" betrachten.
    mit "new" erstellst du eine instanz deiner klasse und arbeitest dann nur noch mit dieser (ausnahme bildet der "::"-operator, aber lassen wir das an dieser stelle *g*).
    über deine instanz rufst du dann immer deine methoden (funktionen innerhalb der klasse) auf:

    $deine_instanz->deine_methode();

    der "->" steht als symbol dafür, dass die methode ein member der klasse ist. ebenso kannst du auf die variabeln der klasse zugreifen, was man aber nicht machen sollte (stichwort private).

    der "$this->"-operator wird nur innerhalb einer klasse benutzt und sagt der methode auf welchen adressraum sie zugreifen soll, "this" steht dabei immer für die klasse wo die aufrufende methode steht.
    über "this" kannst du auch auf variablen innerhalb der klasse zugreifen.
    möchtest du den scope der klasse verlassen und eine ausserhlab liegende methode aufrufen, kannst du (je nach aufbau der programmierung) z.b. folgendes benutzen: $GLOBALS["andere_instanz"]->andere_methode();

    hoffe ich konnte dir ein wenig helfen

    gruß
    cheops

    1. Also ich denke diesen Pfeil habe ich verstanden.

      Wenn ich sage

      $wagen = new Cart;

      Und in der Klasse Cart ist eine funktion einkaufen(), dann muss ich sie per

      $wagen->einkaufen(); aufrufen.

      Stimmt das?

      Was ich noch nicht ganz blicke ist der nutzen von solchen Klassen. Dann kann man doch gleich jede Menge Funktionen machen, ohne eine solche Klasse drumrum.

      1. Hallo,

        (...)$wagen->einkaufen(); aufrufen.

        Stimmt das?

        Ja, das stimmt soweit :-)

        Was ich noch nicht ganz blicke ist der nutzen von solchen Klassen. Dann kann man doch gleich jede Menge Funktionen machen, ohne eine solche Klasse drumrum.

        Kannst Du schon machen, aber wie sieht es bei 200-300 Funktionen und deren eigenen Parameter aus? Da lässt die Übersicht ein wenig zu wünschen übrig :-) Objekte bieten da u.a. den Vorteil der Kapselung und Wiederverwertbarkeit durch die Abstraktion.
        Die Idee dahinter ist das nicht die Funktion an sich im Vordergrund steht, sondern die Operationen und die zugehörigen Daten zu Objektklassen zusammenzuschliessen (= Kapselung). Diese Objekte erhalten dann Schnittstellen um mit der Aussenwelt, also dem restlichen Programm zu kommunizieren ohne das man die eigentlichen Methoden dabei noch einmal anfassen muss. Einmal erstellte Klassen lassen sich auch immemr wieder für weitere Projekte wiederverwenden (= Wiederverwendbarkeit).

        Hoffe ich konnte Dir ein wenig weiterhelfen,
        Grüsse AndreD

        1. Danke, ich werde das Ganze jetzt mal ein bisschen in der Praxis testen und falls ich noch Fragen habe, melde ich mich wieder.