Peter Thomassen: OoP: Klassenvariablen

Hallo Forum,

ich habe mich jetzt mal durch den Thread in [pref:t=33948&m=185164]
angeregt ein bisschen mit objektorientierter Programmierung in
PHP befasst und bin schon auf mein erstes Problem gestoßen:

Klassenvariablen werden ja durch

var $foo;

festgelegt, wahlweise noch mit Wertzuweisung. Wenn ich jetzt aber
eine ganz einfache Klassen nehme:

<?php
class Test {
 function Test() {
  var $test = 0;
 }
}
?>

... und das Script aufrufe, bekomme ich einen Parse Error:

Parse error: parse error in /home/peter/a4a_sam/test.php on line 4

Schreibe ich stattdessen:

<?php
class Test {
 function Test() {
  $test = 0;
 }
}
?>

..., dann tritt der Fehler nicht mehr auf. Kann mir das jemand
erklären?

Danke,
Peter

--
Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
  1. Hallo Peter,

    ..., dann tritt der Fehler nicht mehr auf. Kann mir das jemand
    erklären?

    var darfst Du nur _direkt_ innerhalb von Klassen verwenden.

    class A {
      var $b;

    function A ($wert) {
        $this->b = $wert;
      }
    }

    $a = new A ('hallo');
    echo $a->b;   // ---> hallo

    Grüße,

    Christian

    --
    Ich wünsche allen ein frohes neues Jahr 2003!
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    Hmm, was könnte ich sonst noch in die Signatur schreiben?
    1. Hallo Christian,

      danke für deine Antwort!

      ..., dann tritt der Fehler nicht mehr auf. Kann mir das jemand
      erklären?

      var darfst Du nur _direkt_ innerhalb von Klassen verwenden.

      *argh* *Brett vom Kopp wegnehm* Ich hab mir etliche Beispiele
      angesehen, und hab's trotzdem nicht gesehen ... naja.

      Macht es eigentlich Sinn, im Konstruktor anderes zu tun, als ein
      Objekt zu initialisieren, oder noch schlimmer, macht es Sinn, eine
      Klasse zu erstellen, und dann nur den Konstruktur via new Klasse;
      ohne Variablenzuweisung aufzurufen?

      BTW: Wenn jemand noch ein bisschen OoP-Material hat (bloß nicht
           das von php.net, das hab ich schon 10-mal durchgekaut ;-))
           dann nur her damit - danke! :-)

      Bye,
      Peter

      PS: Stört dich meine Signatur, oder ist das okay so?

      --
      Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
      1. Hallo Peter,

        *argh* *Brett vom Kopp wegnehm* Ich hab mir etliche Beispiele
        angesehen, und hab's trotzdem nicht gesehen ... naja.

        Macht ja nix... :-)

        Macht es eigentlich Sinn, im Konstruktor anderes zu tun, als ein
        Objekt zu initialisieren, oder noch schlimmer, macht es Sinn, eine
        Klasse zu erstellen, und dann nur den Konstruktur via new Klasse;
        ohne Variablenzuweisung aufzurufen?

        Was Du im Konstruktor tust oder lässt, ist Dein Problem, je nachdem, was Du erreichen willst. Eine prinzipielle Antwort ist nicht möglich. Sorry. :-)

        BTW: Wenn jemand noch ein bisschen OoP-Material hat (bloß nicht
             das von php.net, das hab ich schon 10-mal durchgekaut ;-))
             dann nur her damit - danke! :-)

        Kaufe Dir am besten ein gutes Buch über irgendeine objektorientierte Sprache, sei es nun C++, Java, C# oder Object Pascal. Da lernst Du dann, was man mit »Objektorientiertheit« alles machen kann, und Du lernst außerdem noch auf PHP zu fluchen. ;-) Naja, ich setze meine Hoffnungen immer noch auf PHP5, da gibt's dann wenigstens private Variablen und Namespaces und alle Objekte werden standardmäßig per Referenz übergeben. *träum*

        PS: Stört dich meine Signatur, oder ist das okay so?

        *hihi* Nein, im Gegenteil, ist ok. :-)

        Grüße,

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Hallo Peter & Christian,

          Macht es eigentlich Sinn, im Konstruktor anderes zu tun, als ein
          Objekt zu initialisieren, oder noch schlimmer, macht es Sinn, eine
          Klasse zu erstellen, und dann nur den Konstruktur via new Klasse;
          ohne Variablenzuweisung aufzurufen?

          Was Du im Konstruktor tust oder lässt, ist Dein Problem, je nachdem, was Du erreichen willst. Eine prinzipielle Antwort ist nicht möglich. Sorry. :-)

          Hauptsächlich sollte man in einem Konstruktor die Dinge tun, die bei der Objektinitialisierung getan werden sollten. Beispielsweise bei einer Datenbankklasse könnte im Konstruktor erstmal die Verfügbarkeit der DB geprüft und bei Erfolg ein klasseninternes Datenbankhandle erzeugt werden.

          Kaufe Dir am besten ein gutes Buch über irgendeine objektorientierte Sprache, sei es nun C++, Java, C# oder Object Pascal. Da lernst Du dann, was man mit »Objektorientiertheit« alles machen kann, und Du lernst außerdem noch auf PHP zu fluchen. ;-) Naja, ich setze meine Hoffnungen immer noch auf PHP5, da gibt's dann wenigstens private Variablen und Namespaces und alle Objekte werden standardmäßig per Referenz übergeben. *träum*

          Das schöne an OOP bei PHP4 ist, dass es sehr einfach gehalten ist. Für einen Anfänger in Sachen OOP halte ich es für geeignet. Aber Du hast Recht, recht schnell ist man bei PHP4 an den Grenzen angelangt.

          viele Grüße
            Achim Schrepfer

          --
          "Wer noch nie einen Fehler gemacht hat, der hat sich noch nie an etwas Neuem versucht."
          (Albert Einstein)
          1. Hallo Christian, hallo Achim,

            Kaufe Dir am besten ein gutes Buch über irgendeine objektorientierte Sprache, sei es nun C++, Java, C# oder Object Pascal. Da lernst Du dann, was man mit »Objektorientiertheit« alles machen kann,

            Stell dir vor, ich habe im Sommer 450 Seiten MS Visual C++ .NET
            gelesen, hatte aber leider keine Möglichkeit, das auch auszupro-
            bieren. Ich weiß also schon, was Objektorientierung ist und was
            man damit machen kann. Das Problem ist nur, dass PHP eine eigene
            Sprache ist, und sie wäre das nicht auch ohne eigene Syntax.
            Mein Problem ist nämlich eher die PHP-Syntax in der OoP.

            und Du lernst außerdem noch auf PHP zu fluchen. ;-)

            Das tu ich in manchen Fällen eh schon, meistens jedoch aus ande-
            ren Gründen ;-)

            Naja, ich setze meine Hoffnungen immer noch auf PHP5, da gibt's dann wenigstens private Variablen und Namespaces und alle Objekte werden standardmäßig per Referenz übergeben. *träum*

            Das schöne an OOP bei PHP4 ist, dass es sehr einfach gehalten ist. Für einen Anfänger in Sachen OOP halte ich es für geeignet. Aber Du hast Recht, recht schnell ist man bei PHP4 an den Grenzen angelangt.

            Das würde ich nicht sagen. Ich habe kürzlich mal einen Artikel
            über PHP5 gelesen (der war allerdings von 2001), der z.B. einen
            Desktruktor, private/öffentliche Variablen und so weiter ver-
            sprach. Allerdings würde ich nicht sagen, dass PHP dadurch schwe-
            rer wird; der Anfänger kann ja auch ohne Desktruktor schreiben,
            wenn man nicht völlig die Kompatibilität zu vorherigen Versionen
            aufgeben will.

            Bye,
            Peter

            --
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            1. Hallo!

              Das würde ich nicht sagen. Ich habe kürzlich mal einen Artikel
              über PHP5 gelesen (der war allerdings von 2001), der z.B. einen
              Desktruktor, private/öffentliche Variablen und so weiter ver-
              sprach. Allerdings würde ich nicht sagen, dass PHP dadurch schwe-
              rer wird; der Anfänger kann ja auch ohne Desktruktor schreiben,
              wenn man nicht völlig die Kompatibilität zu vorherigen Versionen
              aufgeben will.

              Einen Destruktor gibt es durch PEAR: http://pear.php.net/manual/en/class.pear.php

              Nur - wozu braucht man bitte sowas? Entweder greife ich statisch auf eine Klasse zu oder erstell eine oder mehr Instanzen und greife darauf zu. Aus welchem Grund sollte ich eine Instanz "zerstören" wollen?

              Grüße
              Andreas

            2. Hallo Peter,

              Ich weiß also schon, was Objektorientierung ist und was
              man damit machen kann. Das Problem ist nur, dass PHP eine eigene
              Sprache ist, und sie wäre das nicht auch ohne eigene Syntax.

              das ging allerdings aus Deinem Ursprungsposting nicht so richtig hervor.

              Das schöne an OOP bei PHP4 ist, dass es sehr einfach gehalten ist. Für einen Anfänger in Sachen OOP halte ich es für geeignet. Aber Du hast Recht, recht schnell ist man bei PHP4 an den Grenzen angelangt.

              Das würde ich nicht sagen. Ich habe kürzlich mal einen Artikel
              über PHP5 gelesen (der war allerdings von 2001), der z.B. einen
              Desktruktor, private/öffentliche Variablen und so weiter ver-
              sprach. Allerdings würde ich nicht sagen, dass PHP dadurch schwe-
              rer wird; der Anfänger kann ja auch ohne Desktruktor schreiben,
              wenn man nicht völlig die Kompatibilität zu vorherigen Versionen
              aufgeben will.

              ich habe ja auch von PHP4 gesprochen. PHP5 ist für mich noch nicht Stand der Dinge und außerdem ist die OOP-Implementierung in PHP5 grundlegend anders als in PHP4.

              viele Grüße
                Achim Schrepfer

              --
              "Wer noch nie einen Fehler gemacht hat, der hat sich noch nie an etwas Neuem versucht."
              (Albert Einstein)