Marc2: Verständnisfrage zu der OOP in PHP

Hi,
ich habe in PHP folgende Klasse erstellt. Was ich nicht verstehe, ist für was ich diese Variablen definieren muss:

var $anzahl_der_woerter_1;
var $anzahl_der_woerter_2;
var $verdienst_mit_wortgruppe_1;
var $verdienst_mit_wortgruppe_2;
var $gesamtverdienst;

Wenn ich sie lösche geht die Klasse auch. In dem Beispiel stand aber, dass man sie machen muss.

  
<?php  
class Partnerdetails  
{  
 var $anzahl_der_woerter_1;  
 var $anzahl_der_woerter_2;  
 var $verdienst_mit_wortgruppe_1;  
 var $verdienst_mit_wortgruppe_2;  
 var $gesamtverdienst;  
  
 function __construct($session, $buchstabenlaenge_1, $mulitplikationsfaktor_1, $buchstabenlaenge_2, $mulitplikationsfaktor_2)  
 {  
  //Wörter zählen  
  $sql = "SELECT wort FROM partner_vermittelte_woerter WHERE partner_id='".mysql_real_escape_string($session)."'";  
  $result = mysql_query($sql);  
  $anzahl_der_woerter_1 = 0;  
  $anzahl_der_woerter_2 = 0;  
  while ($row = mysql_fetch_assoc($result)) {  
   if (strlen($row['wort']) < $buchstabenlaenge_1) {  
    $anzahl_der_woerter_1++;  
   } elseif  (strlen($row['wort']) > $buchstabenlaenge_2) {  
    $anzahl_der_woerter_2++;  
   }  
  }  
  $this->anzahl_der_woerter_1 = $anzahl_der_woerter_1;  
  $this->anzahl_der_woerter_2 = $anzahl_der_woerter_2;  
  
  //Verdientes Geld pro Wortgruppe  
  $verdienst_mit_wortgruppe_1 = $anzahl_der_woerter_1 * $mulitplikationsfaktor_1;  
  $verdienst_mit_wortgruppe_2 = $anzahl_der_woerter_2 * $mulitplikationsfaktor_2;  
  
  
  //Gesamtverdienst  
  $gesamtverdienst = $verdienst_mit_wortgruppe_1 + $verdienst_mit_wortgruppe_2;  
  $this->gesamtverdienst = $gesamtverdienst;  
 }  
  
 function anzahl_der_woerter_1()  
 {  
  echo $this->anzahl_der_woerter_1;  
 }  
  
 function anzahl_der_woerter_2()  
 {  
  echo $this->anzahl_der_woerter_2;  
 }  
  
 function verdienst_mit_wortgruppe_1()  
 {  
  echo $this->verdienst_mit_wortgruppe_1;  
 }  
  
 function verdienst_mit_wortgruppe_2()  
 {  
  echo $this->verdienst_mit_wortgruppe_2;  
 }  
  
 function gesamtverdienst()  
 {  
  echo $this->gesamtverdienst;  
 }  
}  
?>  

  1. nach dem Code zu urteilen arbeitest du mit einer PHP Version unter 5! Stimmt das? OOP ist meiner Meinung nach in PHP erst ab PHP 5 wirklich zu gebrauchen und eigentlich ist diese Version auch schon Standart!

    1. nach dem Code zu urteilen arbeitest du mit einer PHP Version unter 5! Stimmt das? OOP ist meiner Meinung nach in PHP erst ab PHP 5 wirklich zu gebrauchen und eigentlich ist diese Version auch schon Standart!

      Ja, das stimmt. Bitte nicht meine Frage aus den Augen verlieren. :)

      1. Hi!

        nach dem Code zu urteilen arbeitest du mit einer PHP Version unter 5! Stimmt das? OOP ist meiner Meinung nach in PHP erst ab PHP 5 wirklich zu gebrauchen und eigentlich ist diese Version auch schon Standart!

        Ja, das stimmt. Bitte nicht meine Frage aus den Augen verlieren. :)

        Danke für Deinen subtilen Hinweis auf Deine Bedürftigkeit eine Lösung zu bekommen - war jetzt schon a bissl frech - egal;)

        Die Frage nach der PHP-Version hatte aber einen Grund, denn Du stellst konkret Fragen zu OOP mit PHP und es gibt da fundamentale Unterschiede.

        Davon abgesehen scheinst Du eine Mischung aus PHP 5 und darunter zu verwenden, oder welche Funktion soll die Methode '__construct' in PHP 4 haben?
        Konstruktoren heissen dort so, wie die Klasse auch.

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. Hello,

          Die Frage nach der PHP-Version hatte aber einen Grund, denn Du stellst konkret Fragen zu OOP mit PHP und es gibt da fundamentale Unterschiede.

          Davon abgesehen scheinst Du eine Mischung aus PHP 5 und darunter zu verwenden, oder welche Funktion soll die Methode '__construct' in PHP 4 haben?
          Konstruktoren heissen dort so, wie die Klasse auch.

          und 'var' hat in PHP5 in dieser Konstelletation nicht viel Sinn für die Klasse.
          http://www.php.net/manual/en/language.oop5.visibility.php

          Dann wären die Attribute public, was die Getter-Funtkionen obselet machen würde.
          Das wären sie in PHP5 übrigens auch, wenn man sie nicht vorher explizit deklariert, sondern dies durch eine implizite Deklaration und Definition im Konsatruktior besorgen lässt.

          Es müsste also besser lauten:

          private $anzahl_der_woerter_1;
           private $anzahl_der_woerter_2;
           private $verdienst_mit_wortgruppe_1;
           private $verdienst_mit_wortgruppe_2;
           private $gesamtverdienst;

          Dann wären die Attribute private und die Getter-Funktionen hätten einen Sinn.

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi Tom!

            und 'var' hat in PHP5 in dieser Konstelletation nicht viel Sinn für die Klasse.

            Danke für Deine Ausführungen und die Bestätigung von Dingen die ich bereits gewußt zu glauben hatte;)

            Der OP hatte aber bereits bestätigt, dass er _nicht_ PHP 5 verwendet - darauf bezog sich meine Frage, warum dann eine Methode so heißt, wie üblicherweise Kontruktoren in PHP 5 benamt werden, obwohl ein PHP 4 - konformer Konstruktor fehlt.

            off:PP

            --
            "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
            1. Hello Peter Pan,

              und 'var' hat in PHP5 in dieser Konstelletation nicht viel Sinn für die Klasse.

              Danke für Deine Ausführungen und die Bestätigung von Dingen die ich bereits gewußt zu glauben hatte;)

              Der OP hatte aber bereits bestätigt, dass er _nicht_ PHP 5 verwendet - darauf bezog sich meine Frage, warum dann eine Methode so heißt, wie üblicherweise Kontruktoren in PHP 5 benamt werden, obwohl ein PHP 4 - konformer Konstruktor fehlt.

              Ja, scheint so, als müsste Marc sich erst einmal entscheiden, unter welcher PHP-Version er programmieren will. Auch in PHP 5 gibt es noch Unterschiede mit der Toleranz für 'var'.

              Und Marc scheint ja ein tutorial zu benutzen. Das müsste dann doch zumindest eine Aussage dazu treffen, welche Version zugrunde gelegt wird.

              Ich kann es leider im Moment nicht ausprobieren mangels älterer Version. Wie reagierte denn die PHP 4, wenn man keinen Kunstruktor definiert hatte?

              Liebe Grüße aus Syburg bei Dortmund

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hi!

                Ja, scheint so, als müsste Marc sich erst einmal entscheiden, unter welcher PHP-Version er programmieren will. Auch in PHP 5 gibt es noch Unterschiede mit der Toleranz für 'var'.

                Zweimal: Ja!

                Ich kann es leider im Moment nicht ausprobieren mangels älterer Version. Wie reagierte denn die PHP 4, wenn man keinen Kunstruktor definiert hatte?

                Man benötigt keinen Konstruktor in PHP 4 für eine Instanziierung, falls Du das meinst.

                off:PP

                --
                "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              2. echo $begrüßung;

                Auch in PHP 5 gibt es noch Unterschiede mit der Toleranz für 'var'.

                Anfänglich war var unter PHP 5 deprecated und wurde mit einer E_STRICT-Meldung bemängelt. Mittlerweise ist var ein Synonym für public.

                Wie reagierte denn die PHP 4, wenn man keinen Kunstruktor definiert hatte?

                Genauso wie PHP 5. Konstruktoren sind optional. Gibt es keinen, wird ein Objekt ebenso angelegt wie mit Konstruktor. Natürlich dann ohne den Konstruktor-Inhalt auszuführen, gibt ja keinen.

                Zur Frage, warum Variablendeklaration weggelassen werden können: Das PHP-Prinzip "Ich leg sie an, wenn du das erste Mal in eine Variable schreibst" gilt auch für die OOP. Das explizite Deklarieren der Klassen-Variablen dient nicht nur der Übersichtlichkeit sondern auch der Initialisierung mit einem Default-Wert. Handelt es sich nicht um einen berechneten Wert kann man den gleich dort angeben und spart sich unter Umständen den Konstruktor.

                class foo {
                    var bar = 'defaultwert';
                    ...
                  }

                echo "$verabschiedung $name";

                1. Hello Dedlfix,

                  Genauso wie PHP 5. Konstruktoren sind optional. Gibt es keinen, wird ein Objekt ebenso angelegt wie mit Konstruktor. Natürlich dann ohne den Konstruktor-Inhalt auszuführen, gibt ja keinen.

                  Was mich dann aber irritiert ist, dass man

                  $__pd = new Partnerdetails(2,33);

                  eine Instanz bilden kann, auch wenn kein Konstruktor, also nur der Standardkonstruktor, also damit keiner mit passender Signatur zur Verfügung steht.

                  Das müsste mMn wenigstens einen Fehler geben!

                  Liebe Grüße aus Syburg bei Dortmund

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hi!

                    Genauso wie PHP 5. Konstruktoren sind optional. Gibt es keinen, wird ein Objekt ebenso angelegt wie mit Konstruktor. Natürlich dann ohne den Konstruktor-Inhalt auszuführen, gibt ja keinen.

                    Was mich dann aber irritiert ist, dass man

                    $__pd = new Partnerdetails(2,33);

                    eine Instanz bilden kann, auch wenn kein Konstruktor, also nur der Standardkonstruktor, also damit keiner mit passender Signatur zur Verfügung steht.

                    Das paßt zur Philososphie von PHP - vergleiche diese Sprache nicht mit Java oder gar C++. Deine Werte 2 und 33 werden eben nicht verarbeitet - in PHP kannst Du Konstruktoren auch nicht überladen.

                    Das müsste mMn wenigstens einen Fehler geben!

                    Nein! Ich kann auch eine Funktion / Methode in PHP mit beliebig unterschiedlicher Parameterfolge aufrufen - unabhängig von der Signatur.
                    PHP bietet Möglichkeiten, innerhalb der Methode / Funktion individuell die aktuell übergebenen Parameter zu ermitteln.

                    gute n8!

                    off:PP

                    --
                    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
                    1. Hello,

                      Das paßt zur Philososphie von PHP - vergleiche diese Sprache nicht mit Java oder gar C++. Deine Werte 2 und 33 werden eben nicht verarbeitet - in PHP kannst Du Konstruktoren auch nicht überladen.

                      Das müsste mMn wenigstens einen Fehler geben!

                      Nein! Ich kann auch eine Funktion / Methode in PHP mit beliebig unterschiedlicher Parameterfolge aufrufen - unabhängig von der Signatur.
                      PHP bietet Möglichkeiten, innerhalb der Methode / Funktion individuell die aktuell übergebenen Parameter zu ermitteln.

                      Ach, dachte ich mir's doch gerade noch!
                      Das ist also die "Überladung" álà PHP.
                      Dieselbe Funktion mit unterschiedlicher Parameterliste aufrufen.

                      Mehr sind möglich, nur zu wenig dürfen es nicht sein.
                      Das gibt dann zumindest eine Warung:

                      Warning: Missing argument 2 for Partnerdetails::__construct()

                      Liebe Grüße aus Syburg bei Dortmund

                      Tom vom Berg

                      --
                      Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Hi!

                        Ach, dachte ich mir's doch gerade noch!
                        Das ist also die "Überladung" álà PHP.
                        Dieselbe Funktion mit unterschiedlicher Parameterliste aufrufen.

                        Ja so in etwa.

                        Mehr sind möglich, nur zu wenig dürfen es nicht sein.
                        Das gibt dann zumindest eine Warung:

                        Warning: Missing argument 2 for Partnerdetails::__construct()

                        Die 'letzten' Parameter können mit einem Default-Wert in der Signatur versehen werden, so dass diese beim Aufruf weg gelassen werden können -z.B:

                          
                          
                        function test($name, $ort='Berlin', $club='Hertha')  
                        ...  
                        // diese Funktion kann dann so benutzt werden:  
                          
                        test('Peter Pan', 'München', 'TSC Guggenbach');  
                          
                        test('Peter Pan', 'München');  
                          
                        test('Peter Pan');  
                          
                        
                        

                        off:PP

                        --
                        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)