Clansuite Community Forum

 
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?

Einloggen mit Benutzername, Passwort und Sitzungslänge
 
Seiten: [1]   Nach unten
  Drucken  
Autor Thema: Objekt in Kindklasse verfügbar machen?  (Gelesen 2398 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« am: Dezember 18, 2008, 10:58:13 »

Moin Moin,

ich hab ein kleines verständigungs Problem mit einer Klasse von mir.

ungefähr folgendes code beispiel:

Code:
Class Basisklasse {

$basisEigenschaft;

             public function runKindklasse1() {
          Kindklasse1::__construct();
              }

             public function runKindklasse2() {
          Kindklasse2::__construct();
             }
}

class Kindklasse1 extends Basisklasse {
public function __construct() {
$this->basisEigenschaft = true; // funktioniert
             }
}

class Kindklasse2 extends Basisklasse {
             public function __construct() {
            $this->basisEigenschaft = $this->getBoolean(); // funktioniert nicht
             }

             public function getBoolean(){
             return true;
            }
}

$obj = new Basisklasse();
$obj->runKindklasse1();
$obj->runKindklasse2();


In den Kindklassen kann ich nicht mit $this (ausser im __construct) auf das Objekt der Basiklasse zugreifen. Das will ich aber :-)

Wie krieg ich das am betsen gelöst?
Gespeichert
Jens-A. Koch
Maintainer
*
Offline Offline

Beiträge: 574

One-Man Team


« Antworten #1 am: Dezember 19, 2008, 12:38:07 »

Code:
class Kindklasse2 extends Basisklasse {
             public function __construct() {
            parent::basisEigenschaft = $this->getBoolean(); // funktioniert nicht
             }

             public function getBoolean(){
             return true;
            }
}
Basisklasse ist parent von Kindklasse2.
Gespeichert

Keine Supportanfragen per PN oder Mail. Fragen bitte nur im Forum stellen (Wie man Fragen richtig stellt).
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« Antworten #2 am: Dezember 19, 2008, 12:49:26 »

das würde nur funktionieren wenn basisEigenschaft static wäre, ist sie aber nicht. Denn so bekommt man ein

Fatal error: Access to undeclared static property
Gespeichert
Jens-A. Koch
Maintainer
*
Offline Offline

Beiträge: 574

One-Man Team


« Antworten #3 am: Dezember 19, 2008, 05:17:35 »

Mein Fehler. Nicht richtig gelesen.

Code:
<?php
class Basisklasse
{
    public 
$basisEigenschaft = &#39;Hallo Welt&#39;;

    
public function runKindklasse1static()
    {
        
Kindklasse1::__construct(); // statischer aufruf
    
}

    public function 
runKindklasse2static()
    {
        
Kindklasse2::__construct(); // statischer aufruf
    
}

    public function 
runKindklasse2()
    {
        new 
Kindklasse2();          // normale instanzierung
    
}
}

class 
Kindklasse1 extends Basisklasse
{
public function __construct()
{
$this->basisEigenschaft true// funktioniert
                
echo $this->basisEigenschaft;      
    }
}

class 
Kindklasse2 extends Basisklasse
{
    public function 
__construct()
    {
        
$this->basisEigenschaft $this->getBoolean(); // funktioniert nicht
        /**
         * Fatal error: Call to undefined method Basisklasse::getBoolean()
         * weil statisch aufgerufen
         * Basisklasse->runKindklasse2static( )
         * Kindklasse2->__construct( )
         */
        
echo $this->basisEigenschaft;      
    }

    public function 
getBoolean()
    {
        return 
true;
    }
}

$obj = new Basisklasse();
$obj->runKindklasse1static(); # Ausgabe: 1
$obj->runKindklasse2(); # Ausgabe: 1
$obj->runKindklasse2static(); # Fehler

?>

Das ist ein "$this" Problem. $this macht eigentlich nix weiter, als auf Eigenschaften oder Methoden im gleichen Objekt zuzugreifen bzw. eine Referenz zu liefern.

Wenn Du eine Methode statisch aufrufst ( Kindklasse1::__construct(); ), dann müssen in der Kindklasse1 auch nachfolgende Methoden statisch aufgerufen werden.
Doppelpunkt zieht Doppelpunkt nach sich.
Folgendes wäre daher als Lösung denkbar: $this->basisEigenschaft = self::getBoolean();

Schritt für Schritt:
Kindklasse1 ist damit nicht instanziert worden.
Nur eine Methode namens "__construct" wurde statisch aufgerufen.
Es existiert keine Referenz $this.
Innerhalb dieser Methode "__construct" wird statisch, eine weitere Methode ( self::getBoolean() ) aufgerufen. = Kein Problem. Läuft durch.

Andersherum formuliert, wenn Du $this->methodenname() als Aufruf im Kind verwendest UND die Methode auch in der Kindklasse steht, muss die Kind-Klasse selbst auch instanziert worden sein.
Ansonsten sucht PHP im aktuellen $this (dem Ausgangspunkt für den statischen Methodenaufruf) nach einem statischen Methodennamen: was auch der Fehleranzeige entspricht: Basisklasse :: getBoolean();

Lösung: Referenz $this mit "new" erzeugen. Daraufhin wird automagic der "__construct" ausgelöst.
Und eine Referenz $this zurückliefert. Wenn die Kindklasse instanziert ist, umfasst $this auch Eigenschaften und Methoden der Elternklasse (extends).

Konntest Du das nachvollziehen?
Gespeichert

Keine Supportanfragen per PN oder Mail. Fragen bitte nur im Forum stellen (Wie man Fragen richtig stellt).
Rikku
Neuling
*
Offline Offline

Beiträge: 24


« Antworten #4 am: Dezember 19, 2008, 06:57:57 »

Jup, vielen Dank. Solangsam wird mein Problem verständlich gelöst. (3Tage umsonst rumprobiert :-) )

Mein Hauptproblem bestand darin, das ich aus der Basisklasse ein Objekt instanziert habe. Dieses Objekt hat Eigenschaften auf die ich aus den Kindklassen drauf zugreifen will (benutzen/verändern). Wenn ich ein neues Kindklassen Objekt erzeugt habe, kann diese zwar auf Eigenschaften und Methoden der Basisklasse zugreifen , aber nicht auf das Objekt der Basisklasse welche schon instanziert wurde und bereits schon Inhalte enthält.

Jetzt bin ich soweit das ich beim instanzieren der Kindklasse auch das aktuelle Objekt der Basiklasse mitübergebe. Erste Test zeigten mir aber schnell das, daß Objekt nur sichtbar im __construct() ist. In anderen Methoden der Kindklasse war das Basiklassen Objekt nicht mehr sichtbar. Jetzt hab ich der Kindklasse eine Eigenschaft $object vepasst, wo ich das Basiklassen Objekt speicher. Nun kann ich in den Kindklassen Methoden mit $this->object->basisEigenschaft auf das Basis Objekt zugreifen.

Irgendwie kompliziert, aber anscheinend funktinoert das. Sieht in etwas so aus:

Code:
<?php
class Basisklasse
{
    public 
$basisEigenschaft;

    public function 
runKindklasse1()
    {
        new 
Kindklasse1($this);
    }
}

class 
Kindklasse1 extends Basisklasse
{
        public 
$object;

public function __construct(Basisklasse $object)
{
$this->object $object
   
        $this->object->basisEigenschaft $this->getBoolean();
         }

         public function 
getBoolean() {
                return 
true;
        }
}

Gespeichert
Jens-A. Koch
Maintainer
*
Offline Offline

Beiträge: 574

One-Man Team


« Antworten #5 am: Dezember 20, 2008, 09:45:39 »

new Kindklasse1($this); mit __construct(Object $obj) ist natürlich ein guter Weg, um das aktuelle Objekt eine Etage tiefer zu verschieben.

Als Idee: Wenn Du das Objekt direkt an den Constructor übergibst, dann könntest Du auch "extends" weglassen - es sei denn Du brauchst neben Eigenschaften auch Methoden aus Basisklasse. Bei diesem Verfahren könnte man auch überlegen, das "Arbeitsstück" als eigenes, von der Basisklasse unabhängiges Objekt herauszustellen. Die Basisklasse würde den Input aufnehmen, damit ein Arbeitsobjekt erstellen und es anschließend an eine andere (Kind)Klasse weitergeben.

Code:
<?php
class Person {
  function 
sayHello() {
    echo 
"Hello, World!";
  }
}
class 
Employer {
  protected 
$person;
  function 
__construct() {
    
$this->person = new Person();
  }
  function 
sayHello() {
    
$this->person->sayHello();
  }
}
?>

Man kann zur Verdeutlichung der Abhängigkeiten auch folgendes fragen:
Hat Employer eine Person? Oder: Ist Employer eine Person? (dann extends). Das deckt dann meistens die Zusammenhänge ganz gut auf.
Gespeichert

Keine Supportanfragen per PN oder Mail. Fragen bitte nur im Forum stellen (Wie man Fragen richtig stellt).
Seiten: [1]   Nach oben
  Drucken  
 
Gehe zu:  


Powered by SMF 1.1.16 | SMF © 2006-2009, Simple Machines

Google visited last this page Heute um 02:17:55