Micha: PHP Klassenversteh problem

Habe kein kleines Verständnisproblem:

class foo
{
   var $test;
   function bar(){
      $this->test;
   }
}

Mit $this->test; wäre ja hier die Variable $test gemeint. Nun habe ich Klasse gefunden die so aussieht:

class foo
{
   function bar(){
      $this->test;
   }
}

Wie verstehe ich hier $this->test;?

Gruß

Micha

  1. Hallo Micha,

    class foo
    {
       var $test;
       function bar(){
          $this->test;
       }
    }

    Mit $this->test; wäre ja hier die Variable $test gemeint. Nun habe ich Klasse gefunden die so aussieht:

    class foo
    {
       function bar(){
          $this->test;
       }
    }

    Wie verstehe ich hier $this->test;?

    Ist fehlerhaft (soeben ausgetestet). Bei error_reporting(E_ALL) gibt er eine Notiz aus, wenn man von der Klasse ein Objekt anlegt und die Funktion bar() aufruft.
    Das Beispiel oben ist korrekt.

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Hello,

      class foo
      {
         var $test;
         function bar(){
            $this->test;
         }
      }

      Mit $this->test; wäre ja hier die Variable $test gemeint. Nun habe ich Klasse gefunden die so aussieht:

      class foo
      {
         function bar(){
            $this->test;
         }
      }

      Wie verstehe ich hier $this->test;?

      Ist fehlerhaft (soeben ausgetestet). Bei error_reporting(E_ALL) gibt er eine Notiz aus, wenn man von der Klasse ein Objekt anlegt und die Funktion bar() aufruft.
      Das Beispiel oben ist korrekt.

      Was soll das denn auch bewirken?

      $this->test;

      ist eine unvollständige Anweisung. Es ist weder eine Ausgabeanweisung, noch eine Zuweisung noch eine Rechenoperation...  Der Parser nimmt daher an, dass auf $this->test als Datenquelle referenziert werden soll, was natürlich nicht geht (glücklicherweise), wenn es noch keine Instanz dieses (unbestimmten) Typs gibt.

      Harzliche Grüße vom Berg
      esst mehr http://www.harte-harzer.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo Tom,

        Was soll das denn auch bewirken?

        $this->test;

        ist eine unvollständige Anweisung.

        Jupp. Aber in PHP ist das sogar gültig (auch wenn bei E_ALL eine Notiz (sprich: keine Warnung) ausgegeben wird). Danach ist die Variable AFAIK initialisiert.

        Sauber ist es hingegen nicht - und deshalb habe ich einfach gesagt es ist falsch. ;-)

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
        1. Hello,

          Jupp. Aber in PHP ist das sogar gültig (auch wenn bei E_ALL eine Notiz (sprich: keine Warnung) ausgegeben wird). Danach ist die Variable AFAIK initialisiert.

          Nö, nicht dass ich wüsste. Das wäre ja schlimm, wenn eine Variable "initialisiert" wird, nur weil man darauf (lesend) zugreift. Kannst Du ja auch ganz einfach ausprobieren, indem du das Konstrukt einfach mehrmals in den Source schreibst. Wenn Du dann für jedes Vorkommen eine Notice kassierst, ist auch nix initialisiert worden...

          Harzliche Grüße vom Berg
          esst mehr http://www.harte-harzer.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hallo Tom,

            Nö, nicht dass ich wüsste. Das wäre ja schlimm, wenn eine Variable "initialisiert" wird, nur weil man darauf (lesend) zugreift. Kannst Du ja auch ganz einfach ausprobieren, indem du das Konstrukt einfach mehrmals in den Source schreibst. Wenn Du dann für jedes Vorkommen eine Notice kassierst, ist auch nix initialisiert worden...

            Du hast Recht.

            <?php  
            error_reporting(E_ALL);  
              
            class foo {  
              function bar() {  
                $this->test;  
                echo $this->test;  
              }  
            }  
              
            $myFoo = new foo();  
            $myFoo->bar();  
            ?>
            

            Der Aufruf der Datei erzeugt ohne error_reporting(E_ALL) keine Ausgabe, mit gibt es jedoch zwei Notices aus - beide Male, weil die Variable undefiniert ist.

            Ersetzt man die Zeile mit

            $this->test;

            jedoch durch

            $this->test = "bar\n";

            so gibt es auch keine Notices - weil er dann die Variable anlegt.
            Da sieht man halt doch wieder, dass die Vorschriften von PHP etwas lax sind. Da ich PHP 4 verwende, würde ich aber doch gerne wissen, ob der Code oben (inklusive Zuweisung von "bar\n") in PHP 5 genausowenig Warnungen ausgibt.

            Grüße

            Marc Reichelt || http://www.marcreichelt.de/

            --
            Linux is like a wigwam - no windows, no gates and an Apache inside!
            Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            http://emmanuel.dammerer.at/selfcode.html
            1. Hallo Marc.

              Da ich PHP 4 verwende, würde ich aber doch gerne wissen, ob der Code oben (inklusive Zuweisung von "bar\n") in PHP 5 genausowenig Warnungen ausgibt.

              PHP5 reagiert wie PHP4.

              Einen schönen Dienstag noch.

              Gruß, Ashura

              --
              Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
              30 Days to becoming an Opera8 Lover -- Firefox tools for Opera built-ins
              Meine Browser: Opera 8.02 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
              MathML fetzt
            2. echo $begrüßung;

              $this->test = "bar\n";

              so gibt es auch keine Notices - weil er dann die Variable anlegt.
              Da sieht man halt doch wieder, dass die Vorschriften von PHP etwas lax sind.

              Das ist nun mal das Konzept von PHP, dass Variablen implizit angelegt werden und nicht deklariert werden müssen. Es muss noch nicht mal ein Objekt vorhanden sein, um einer Objektvariable etwas zuzuweisen. Dann wird eben zu dem Zeitpunkt ein neues Objekt erzeugt, dessen Klasse stdClass ist.

              $a->b = 42;
                var_dump($a);

              ergibt:

              object(stdClass)#1 (1) {
                  ["b"]=>
                  int(42)
                }

              echo "$verabschiedung $name";

  2. echo $begrüßung;

    class foo
    {
       function bar(){
          $this->test;
       }
    }

    Wie verstehe ich hier $this->test;?

    Wie in PHP üblich muss man Variablen vor Gebrauch nicht deklarieren. Das gilt auch für Objekt-Variablen. Beim ersten Schreibzugriff werden sie angelegt, wenn sie bis dato noch nicht vorhanden waren.

    echo "$verabschiedung $name";