kostenloser Webspace werbefrei: lima-city


Konstruktor überladen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    m7d

    m7d hat kostenlosen Webspace.

    Moin moin,

    Ich bin jetzt nach längerer Zeit, die ich hauptsächlich mit Java verbracht habe, wieder bei PHP gelandet. Nach einiger Eingewöhnungszeit läuft die Entwicklung jetzt auch wieder recht flüßig, dennoch bin ich in einigen routinen noch recht festgefahren, sodass ich Wege gehe, die offentsichlich mit PHP nicht so gut lösbar sind.

    Nun entstand bei mir ein Problem, das durch das Überladen eines Konstruktors sehr schön und einfach hätte gelöst werden können. Leider scheint PHP diese Möglichkeit nicht anzubieten, wie ich feststellen musste. Jedenfalls nicht so, wie ich es gewohnt war.

    Meine Frage wäre, welche Möglichkeiten es gibt, den Konstruktor doch noch zu überladen.
    Meine Ideen waren allesamt weniger schön. Mein erster Gedanke war es zwei Klassen zu schreiben, die lediglich aus Konstruktor und Rückgabemethode bestehen, die dann über eine dritte Klasse ein einheitliches Objekt über zwei verschiedene Wege erzeugen, und mir zurückgeben. Oder eben einfach zwei fast gleiche Klassen zu schreiben, die dann nur so vor Code-Redundanz strotzen.

    Vielleicht gibt es hier ja noch schönere Ideen, dies zu realisieren.

    Mit freundlichen Grüßen,
    M7D
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du kannst den Konstruktor ganz normal überladen. Aber Vorsicht: In Java wird automatisch der parent-Konstruktor aufgerufen. In PHP ist das nicht so. Du musst es also selbst tun.
    Bsp:
    public function __construct() {
      parent::__construct();
      // weiterer Code
    }

    Wenn dann noch irgendwas nicht funktioniert, wie du es erwartest, poste bitte einmal ein Beispielskript.
  4. Autor dieses Themas

    m7d

    m7d hat kostenlosen Webspace.

    Wie in Java zu überladen hat bei mir nicht funktioniert. Folgendermaßen hatte ich meinen Programmcode in etwa geschrieben:


    class ProduktAnzeige
    {
    	private $_prod;
    	private $_anzahl;
    	
    	/**
    	 * Konstruktor für ein Produkt Objekt 
    	 * @param Produkt $produkt
    	 */
    	public function __construct($produkt)
    	{
    		$this -> _anzahl = 1;
    		$this -> _prod = $produkt;		
    	}
    	
    	/**
    	 * Konstruktor für ID 
    	 */
    	public function __construct($prodID, $anzahl)
    	{
    		$this -> _anzahl = $anzahl;
    		$this -> _prod = getProduktbyID($prodID);
    	}
    
            [...]
    }


    Warf dann aber die Fehlermeldung:
    Fatal error: Cannot redeclare ProduktAnzeige::__construct()
  5. Oh, tut mit leid. Ich hab wohl grad überladen und überschreiben (bei Vererbung) verwechselt.

    Ja, man kann in PHP keine Methoden überladen (gilt dementsprechend für Konstruktoren)
    Du hast mehrere Möglichkeiten, das Problem zu lösen:

    a) Default-Parameter
    class ProduktAnzeige {
      private $_prod, $_anzahl;
    
      public function __construct($produkt, $anzahl=1) {
        $this -> _anzahl = $anzahl;
        $this -> _prod = $produkt;
      }
    }
    
    new ProduktAnzeige($meinProdukt);
    // Entspricht dann
    new ProduktAnzeige($meinProdukt, 1);
    Allerdings möchtest du bei Angabe der Anzahl die Produkt-ID anstatt dem Produkt haben.
    Das ließe sich so lösen:

    b)
    class ProduktAnzeige {
      private $_prod, $_anzahl;
    
      public function __construct($produkt, $anzahl=null) {
        if (is_null($anzahl)) {
          $this -> _anzahl = 1;
          $this -> _prod = $produkt;       
        } else {
          $this -> _anzahl = $anzahl;
          $this -> _prod = getProduktbyID($prodID);
        }
      }
    }


    c)
    Funktioniert ab PHP 5.6, das wird morgen hier installiert:
    class ProduktAnzeige {
        private $_prod;
        private $_anzahl;
    
        /**
         * Sammelkonstruktor
         */
        public function __construct(...$params) {
            switch(count($params)) {
              case 1:
                self::__construct1(...$params);
                break;
              case 2:
                self::__construct2(...$params);
                break;
              default:
                // Fehler, falsche Parameterzahl
                break;
            }
        }
         
        /**
         * Konstruktor für ein Produkt Objekt 
         * @param Produkt $produkt
         */
        private function __construct1($produkt) {
            $this -> _anzahl = 1;
            $this -> _prod = $produkt;       
        }
         
        /**
         * Konstruktor für ID 
         */
        private function __construct2($prodID, $anzahl) {
            $this -> _anzahl = $anzahl;
            $this -> _prod = getProduktbyID($prodID);
        }
    }
  6. Autor dieses Themas

    m7d

    m7d hat kostenlosen Webspace.

    Der Default-Parameter liefert wohl das übersichtlichste Ergebnis, vielen Dank schonmal dafür.
    Ich werde das gleich mal ausprobieren.

    Über die Parameteranzahl zu switchen wirkt auf mich sehr unübersichtlich. Vor allem, wenn man vielleicht mal
    zwei Methoden mit gleicher Anzahl an Paramtern aber unterschiedlichen erwarteten Typen hat. Auch wenn in PHP nicht so streng unterschieden wird, könnte das ja trotzdem mal der Fall sein.

    Vielleicht ist es auch einfach nur ungewohnt :rolleyes:

  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!