wucher wichtel: Problem mit Arrays und OOP + Verständnisfragen

Hallo!

Da ich mich zur Zeit mit PHP beschäftige, habe ich mal bei OOP mit PHP vorbeigeschaut, um einen kleinen Überblick zu bekommen. Jetzt habe ich eine Klasse geschrieben, aber dabei einige Fragen und ein Problem. Hier mal der Quelltext:

  
  class CheckString {  
  
    var $words = array('<a', '\[link', '\[url');  
    var $wordsLength = count($this->words); // Das ist Zeile 6  
    var $punkte = null;  
  
    function checkString($data) {  
      for($i = 0; $i < $this->wordsLength; $i++){  
        if( eregi($this->wordsLength[i])){  
          $this->punkte = $this->punkte + 1;  
        }  
      }  
  
      return "Ihr Eintrag enthält ".$this->punkte." von den ".$this->wordsLength." verbotenen Wörtern! Bitte löschen Sie diese.";  
  
    }  
  
  }  
  
  $text = "<a test test";  
  
  $check = new checkString();  
  
  print $check->checkString($text);  

Als erstes zu meinem Problem: Die Fehlermeldung lautet:

#######################################################
Parse error: parse error, unexpected '(', expecting ',' or ';' in D:\xampp\xampp\htdocs\checkString.php on line 6
#######################################################

Was muss ich beachten, wenn ich Arrays bei OOP verwenden will? Oder mache ich etwas falsch, wo ich einfach nicht sehe, obwohl ich eigentlich weiss wie es geht? :-)

Nun zu meinen Fragen. Wie muss ich eine Klasse aufrufen, wenn diese nur einen Konstruktor enthält? Wann machen Konstruktoren sinn? Habe ich es richtig verstanden, dass eine Klasse keinen Konstruktor haben muss?

In Zeile 6 habe ich folgendes stehen: count($this->words);. Ist das richtig? Ich meine das "$this->words". Das stimmt schon so, oder?

Vielen Dank für eure Antworten!

ciao, ww

--
Ein japanisch-deutsches Gedicht
sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
  1. Hellihello wichtel,

    #######################################################
    Parse error: parse error, unexpected '(', expecting ',' or ';' in D:\xampp\xampp\htdocs\checkString.php on line 6
    #######################################################

    in der Variablendefinition darfst Du m.W. keine Funktionen verwenden.

    Nun zu meinen Fragen. Wie muss ich eine Klasse aufrufen, wenn diese nur einen Konstruktor enthält? Wann machen Konstruktoren sinn? Habe ich es richtig verstanden, dass eine Klasse keinen Konstruktor haben muss?

    in PHP kannst Du auch function __construct() nehmen. Bei Deinem Beispiel ist der Klassenname nicht ident mit dem Funktionsnamen des Konstruktors.

    Du brauchst den Konstruktor nur wenn du möchtest, dass eine Funktion beim intantiieren eines neuen Objektes aufgerufen werden soll.

    In Zeile 6 habe ich folgendes stehen: count($this->words);. Ist das richtig? Ich meine das "$this->words". Das stimmt schon so, oder?

    ja.

    Gruß,

    frankx

    1. Hallo!

      Danke für deine Antwort.

      #######################################################
      Parse error: parse error, unexpected '(', expecting ',' or ';' in D:\xampp\xampp\htdocs\checkString.php on line 6
      #######################################################

      in der Variablendefinition darfst Du m.W. keine Funktionen verwenden.

      Und wie soll ich das dann schreiben? Ich bin echt überrascht :)

      Nun zu meinen Fragen. Wie muss ich eine Klasse aufrufen, wenn diese nur einen Konstruktor enthält? Wann machen Konstruktoren sinn? Habe ich es richtig verstanden, dass eine Klasse keinen Konstruktor haben muss?

      Bei Deinem Beispiel ist der Klassenname nicht ident mit dem Funktionsnamen des Konstruktors.

      Achja, stimmt. Danke.

      ciao, ww

      --
      Ein japanisch-deutsches Gedicht
      sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
      1. Probiers doch mal so in etwa:

          
          class StringClass {  
          
            var $words = array('<a', '\[link', '\[url');  
            var $wordsLength;  
         var $out;  
            var $punkte = 0;  
          
         function iniString() {  
         $this->wordsLength = count($this->words);  
         }  
          
            function checkString($data) {  
          
         $this->iniString();  
          
              for($i=0; $i<$this->wordsLength; $i++){  
          
                if(preg_match('/'.$data.'/',$this->words[$i])==true){  
                $this->punkte++;  
                }  
          
              }  
          
             $this->out = "Ihr Eintrag enthält ".$this->punkte." von den ".$this->wordsLength." verbotenen Wörtern! Bitte löschen Sie diese.";  
          
            }  
          
         function Output() {  
         echo $this->out;  
         }  
          
          }  
          
          $text = "<a test test";  
          
          $check = new StringClass();  
          $check->checkString($text);  
          $check->Output();  
          
        
        

        Hoffe es hilft. Grüße.

        1. Hallo!

          Danke für den Code. Aber leider funktioniert er nicht. Die Eigenschaft $punkte wird nicht um eins erhöht.

            
          
          >  function Output() {  
          >  echo $this->out;  
          >  }  
          >   
          >   }  
          >   $check->Output();  
          
          

          Diese Schreibweise, mit einer extra Methode, die nur das Ergebnis ausgibt, habe ich jetzt schon zum zweiten Mal gelesen. Hat es Vorteile, die Ausgabe so zu regeln?

          ciao, ww

          --
          Ein japanisch-deutsches Gedicht
          sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
          1. Hmmm, habs vorher nicht getestet, aber das liegt dann nicht am oop sondern an mir denke ich ;)
            Lass dir einfach mal das ganze als Klartext ausgeben und debugge.

            Wie dus machst bleibt eigentlich dir überlassen. Erst bei größeren Anwendungen hast du Vorteile (aber auch Nachteile).

            Der Nachteil deiner Methode ist, dass sie jedesmal neu errechnet wird, wenn du sie aufrufst. Das heißt jedes mal wenn du sie ansprichst wird das Array neu durchgezählt. Hat in diesem Fall zeitlich kaum Nachteile, aber wenn du erstmal eine Längere Methode mit Datenbankverbindung etc. hast und deren Ergebnis häufiger brauchst lohnt sich das schon.

            In dem Fall hier ist es aber eigentlich schon fast schlechter Stil wie ichs dir hier reingekritzelt habe.
            Das andere kann man schon so stehen lassen.

  2. Moin!

    Erst mal: hab nicht so viel Ahnung von OOP, aber

    var $wordsLength = count($this->words);

    ist ja eine Eigenschaft, da kannst Du IMHO keine Berechnungen usw. durchführen. Dafür brauchst Du eine Funktion bzw. "Methode".

    function checkString($data) {

    Das ist der Konstruktor (gleicher Name wie die Klasse). Der wird bereits beim Erstellen des Objekts aufgerufen.

    $check = new checkString();

    Hier wird checkString() ohne den Parameter $data aufgerufen...

    print $check->checkString($text);

    ...und hier nochmal mit Parameter!

    Man könnte das Zählen des Arrays (count()) in den Konstruktor packen und das Überprüfen der Wörter mit einer Methode machen.

    Der Aufruf sähe dann irgendwie so aus:

    $check = new checkString();
    $check->ist_der_string_ok($text);

    Tom

    1. Hallo!

      Ok, danke euch beiden. Ich habe einige Fehler reingebaut, die nicht hätten sein müssen. Diese habe ich jetzt verbessert. Aber es klappt immer noch nicht. Warscheinlich wegen dem Array. Hier mein Code:

        
        class CheckString {  
        
            var $words = array('<a', '\[link', '\[url');  
            var $punkte = null;  
        
            function wordsLength() {  
              return count($this->words);  
            }  
        
            function checkData($data) {  
              for($i = 0; $i < $this->wordsLength(); $i++){  
                if( eregi($this->words[i], $data)){  
                  $this->punkte = $this->punkte + 1;  
                }  
              }  
        
            return "Ihr Eintrag enthält ".$this->punkte." von den ".$this->wordsLength()." verbotenen Wörtern! Bitte löschen Sie diese.";  
        
          }  
        
        }  
        
        $text = "<a test test";  
        $check = new CheckString();  
        print $check->checkData($text);  
      
      

      Die Fehlermeldung lautet:
      #########################
      Warning: eregi() [function.eregi]: REG_EMPTY in D:\xampp\xampp\htdocs\checkString.php on line 14

      Warning: eregi() [function.eregi]: REG_EMPTY in D:\xampp\xampp\htdocs\checkString.php on line 14

      Warning: eregi() [function.eregi]: REG_EMPTY in D:\xampp\xampp\htdocs\checkString.php on line 14

      Ihr Eintrag enthält von den 3 verbotenen Wörtern! Bitte löschen Sie diese.
      #########################

      Jetzt gehe ich erst mal eine Runde schlafen, damit ich morgen wieder fit bin ;-) Vielen Dank!

      ciao, ww

      --
      Ein japanisch-deutsches Gedicht
      sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
      1. Hallo!

        Wenn ich das Ermitteln der Länge des Arrays so abwickle...

          
        var $wordsLength;  
        # [...]  
        function wordsLength() {  
          $this->wordsLength = count($this->words);  
        }  
        # [...]  
        for($i = 0; $i < $this->wordsLength; $i++){  
        # [...]  
        
        

        Dann funktioniert es auch nicht.

        Jetzt gehe ich erst mal eine Runde schlafen, damit ich morgen wieder fit bin ;-)

        Aber jetzt wirklich :)

        ciao, ww

        --
        Ein japanisch-deutsches Gedicht
        sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
        1. Woher auch? Die Methode wordsLength wird an keiner Stelle aufgerufen. Warum sollte der Parser denn die Methode durchrechnen?

          1. Hallo!

            Ich hab's. Danke an alle, die mir geholfen haben. Für's Archiv stelle ich mal den Quelltext hier rein:

              
              class CheckString {  
              
                var $words = array('<a', '\[link', '\[url');  
                var $wordsLength;  
                var $i;  
                var $punkte = 0;  
              
                function wordsLength() {  
                  $this->wordsLength = count($this->words);  
                }  
              
                function checkData($data) {  
                  $this->wordsLength();  
                  for($i = 0; $i < $this->wordsLength; $i++){  
                    if( eregi($this->words[$i], $data)){  
                      $this->punkte = $this->punkte + 1;  
                    }  
                  }  
              
                return "Ihr Eintrag enthält ".$this->punkte." von den ".$this->wordsLength." verbotenen Wörtern! Bitte löschen Sie diese.";  
              
                }  
              
              }  
              
              $text = "<a test test";  
              $check = new CheckString();  
              print $check->checkData($text);  
            
            

            Nochmals Vielen Dank!

            ciao, ww

            --
            Ein japanisch-deutsches Gedicht
            sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
            1. Hellihello

              php kennt "foreach":

                
                
                     foreach ($this->words as $word){  
                       if( eregi($word, $data)){  
                         $this->punkte = $this->punkte + 1;  
                       }  
                     }  
                
              
              

              Gruß,

              frankx

              1. Hallo!

                php kennt "foreach":

                Ups. Alte JavaScript-Angewohnheit :) Danke!

                ciao, ww

                --
                Ein japanisch-deutsches Gedicht
                sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)