PHP Objektorientiert: this->... und var $varbaible - Frage

  • Hallo,
    um mein objektorientiertes Wissen zu festigen habe ich mich an ein
    Tutorial gesetzt und habe nun 2 Fragen welche dort noch nicht benatwortet
    werden.

    http://www.php-kurs.com/objektorientie…ng-beispiel.htm
    Ausschnitt:

    Code
    class auto
    {
    
    
        // eine Eigenschaft/Attribut festlegen
        var $benoetigter_kraftstoff;


    Muss man immer var schreiben, normalerweise brauchte man dies ja
    in PHP noch nicht. Beispiels ($apfel = 1; oder $apfel++;...)

    Code
    // Anzahl der betankungen wird um 1 erweitert
            $this->anzahl_betankungen++;


    Und dann wollte ich noch grahen wofür das $this-> Benötogt wird,
    normalerweise habe ich wie oben schon in der Variable nur $apfel++; geschrieben.

    Wäre dankbar für eine kurze Erklärung :)
    Danke

  • zu den variablen:

    normalerweise muss in jeder sprache jede variable definiert werden.
    meistens sogar mit typ. in visual basic ises dann z.b.

    Code
    DIM strText as String
    DIM intZahl as Integer
    DIM bolWert as Boolean

    PHP macht da scheinbar eine ausnahme und stellt die variable sofort zur verfügung.

  • Hallo, das kenne ich also macht es in dem Sinne kein Unterschied ob
    mit var oder nicht davor?

    Dachte das es durch das Objektorientierte vielleicht sein muss, da
    es ja in einer Klasse ist. Die Funktionen heißen da ja auch Methoden
    und die Variablen Eigenschaften ^^

  • Du setzt in der objektorientierung in php5 eigentlich kein var davor, sondern private, protected oder public, genau wie auch bei den Funktionen einer Klasse.
    Private heißt die Variable/Funktion ist nur innerhalb der eigenen Klasse verfügbar.
    Protected heißt die Variable/Funktion ist nur in der eigenen Klasse und in Mutter-/Tochter-Klassen verfügbar.
    Public heißt die Variable/Funktion ist auch außerhalb der Klasse verfügbar (natürlich mit Referenzierung auf das entsprechende Objekt).

    z.B.

    PHP
    class auto {
        private $kmh;
        ...
        public getZeit($entfernung) {
            ...
        }
    }

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Das var bedeutet dass dies eine Objektvariable ist, also später mittels $this->blah zugänglich ist.
    In PHP gab es keine unterschiedlichen Sichtbarkeiten, jede Funktion und Variable ist dort public. Es gibt also kein private / public / protected, aber nur var (in PHP4).
    Dies wurde in PHP5 erweitert.

  • Die Variable $benoetigter_kraftstoff wird weder nur für die Funktion noch global sondern auf Objekt-Ebene gespeichert. Sie ist ein Element des Objekts, z.B.:

    PHP
    $t = new TestClass();
    $t->benoetigter_kraftstoff = 'hallo';


    Deshalb muss zuvor das Objekt angegeben werden. Wird nun eine nicht-statische Element-Funktion aufgerufen (deine Funktion), so wird $this automatisch mit dem Objekt verknüpft, auf dem die Funktion aufgerufen wurde.

    PHP
    class TestClass
    {
    public function test()
    {
      echo '$this ist $test';
    }
    }
    $test = new TestClass();
    $test->test();

    In anderen Sprachen wird bei weggelassenem this, self oder ähnlichem oft automatisch das Objekt-Element verwendet. In PHP ist dies jedoch nicht der Fall. Du musst stets zwischen Klassenelement und lokaler Variable unterscheiden. Das hat sicherlich mit der Kompatiblität zu normalen Funktionen zu tun:

    PHP
    function nonOOP() { $a = 12; ++$a; echo $a; }
    class OOP
    {
    protected $a;
    public function test() { $a = 12; ++$a; echo $a; }
    }


    Gäbe es nun die automatische Verwendung von Klassenelementen in PHP, so würde die Funktion unwillentlich nach der Portierung zur OOP die objekt-interne Variable bearbeiten. In anderen Sprachen ist dies ausgeschlossen, da die Variable zuvor lokal deklariert werden müsste.

    Viele liebe Grüße
    The User

  • Danke nun habe ich es verstanden.

    Kurz gefasst braucht man das $this-> also um Eigenschaften auf
    ein Objekt dynamisch zu beziehen und mit var leitet man diese
    Eigenschaften so ein und definiert sozusagen das es OOP ist.

    Ist $this-> ... demnach der Konstruktor?

  • Zitat von Darkxor


    nun habe ich es verstanden.


    Veto!

    Zitat von Darkxor


    Kurz gefasst braucht man das $this-> also um Eigenschaften auf
    ein Objekt dynamisch zu beziehen und mit var leitet man diese
    Eigenschaften so ein und definiert sozusagen das es OOP ist.

    Blödsinn! Der erste Teil ist mit guten Willen nicht ganz falsch, trotzdem zeugt es nicht gerade von Verständnis der Sache.
    $this bezieht sich immer auf die Aktuelle Klasse (nicht Objekt). Hierüber kannst du nicht nur auf Eigenschaften der KIasse zugreifen, sondern auch auf dessen Methoden.
    Letztendlich dient es eher dazu, dass man nicht ständig Klasse::Methode() oder Klasse::Eigenschaft schreiben muss.

    Eigenschaften und Funktionen so

    PHP
    class MyClass {
      var $eigenschaft;
    }

    zu deklarieren, ist veraltet. Das wurde oben bereits erwähnt.
    Aus dieser Schreibweise die Objektorientierung an sich abzuleiten, ist mein persönlicher Lacher des Tages.
    OOP ist doch keine Notation!!

    Und nein: $this-> ist kein Konstruktor!
    Das

    PHP
    class MyClass {
      public function __construct() {
       somecode
      }
    }

    Ist ein Konstruktor in php.

    Da ist noch ne ganze Menge theoretischer Nachholbedarf bei dir^^