Zur Boardunity Forenstartseite

Zurück   Boardunity Ratgeber Forum » Technik » Programmierung und Datenbanken

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1  
Alt 23.02.2004, 20:54
Mitglied
 
Registriert seit: 06.2003
Beiträge: 64

[PHP]Zugriff von einer Unterklasse auf eine andere


Folgendes Beispiel:

PHP-Code:
class A
{
var 
$test;
    function 
example()
    {
        echo 
"I am A::example() and provide basic functionality.<br>\n";
    }
}

class 
extends A
{
var 
$test2;
    function 
example()
    {
        echo 
"I am B::example() and provide additional functionality.<br>\n";
        
parent::example();
    }
}
 
class 
extends A
{
    function 
example()
    {
        echo 
"I am C::example() and provide additional functionality.<br>\n";
        
parent::example();
    }

Wie kann ich nun von der Methode der Klasse C auf die Methode der Klasse B zugreifen und wie sieht das gleiche mit Variablen aus?

Wie greife z. B. von der Klasse C auf die Variable $test2 von Klasse B und auf die Variable $test von Klasse A zu?
  #2  
Alt 23.02.2004, 21:15
Mitglied
 
Registriert seit: 10.2003
Ort: Bottrop
Beiträge: 779
Hi. Vererbung in PHP hab ich mich zwar noch nicht mit beschäftigt, aber ersteres geht so nicht.
Die eine Klasse hat (bis auf die Basis) nichts mit der anderen zu tun.
Einzige Möglichkeit:
B::example();

Das zweite könnte so aussehen (ungetestet und ungeprüft):
parent->test (von B nach A)
B::test2 (von C nach A).

Ansonsten musst du halt ein B initialisieren.

__________________
Patrick Gotthardt
Patrick Gotthardt on Software
  #3  
Alt 23.02.2004, 21:59
Mitglied
 
Registriert seit: 06.2003
Beiträge: 64
PHP-Code:
class A
{
var 
$test "test";
var 
$b;
var 
$c;
    function 
example()
    {
        echo 
"I am A::example() and provide basic functionality.<br>\n";
        
$this->= new B;
        
$this->= new C;
        
$this->c->example();

    }
}

class 
extends A
{
var 
$test2 "test2";
    function 
example()
    {
        echo 
"I am B::example() and provide additional functionality.<br>\n";

    }
}

class 
extends A
{
    function 
example()
    {
        echo 
"I am C::example() and provide additional functionality.<br>\n";        
        
$this->b->example();
    }


$a = new A;
$a->example(); 

Hab mal folgendes probiert. Allerdings meldet PHP, dass die Variable b kein Objekt ist.

Allerdings kann ich in der Klasse C die Variable test folgendermaßen ausgeben:

PHP-Code:
echo $this->test

  #4  
Alt 23.02.2004, 23:35
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888
Wenn du von der Klasse C aus auf $this->b als Objekt zugreifen willst ist es kein Wunder das dass nicht funktioniert, schliesslich wurde $this->b bis dato noch nicht als Instanz einer Klasse bzw. als Objekt definiert.
Um auf $this->b als Instanz der Klasse B zuzugreifen müsstest du in C::example() erstmal eine Intanz erzeugen, also $this->b = new B;
Das in A::example() dies getan wird bringt dir nichts, da diese Methode ja nicht aufgerufen wird.
Du kannst im Übrigen auf eine Objekteigenschaft nur von innerhalb dieses Objekts bzw. über $objekt->eigenschaft zugreifen. Solange du keine Instanz einer Klasse erzeugt hast kannst du nicht über die Klasse::Methode() Syntax auf eine Objekteigenschaft zugreifen, da du mit dieser Syntax kein Objekt erstellt hast. Ebenfalls kann die Klasse::Methode() Funktion nicht auf die eigenen Eigenschaften zugreifen da diese, ohne instanziierung durch den new Operator und Zugriff mit $objekt->eigenschaft, noch nicht definiert sind.
Wenn du also mit einem Objekt auf die Eigenschaften von drei Klassen zugreifen willst muss von jeder dieser Klassen eine Instanz existieren. Du könntest das z.B. so lösen das die zweite Klasse die Erste erweitert und die Dritte das gleiche mit der Zweiten macht. Wenn du dann eine Instanz der dritten Klasse erstellst hättest du die Methoden und Eigenschaften aller drei Klassen in einem Objekt.
Beispiel:

PHP-Code:
<?PHP
/**
 * Klasse A ...
 **/
class A
{
        var 
$propertyA "Ich bin die Eigenschaft A::propertyA!\n";
}

/**
 * Klasse B erweitert Klasse A ...
 **/
class extends A
{
        var 
$propertyB "Ich bin die Eigenschaft B::propertyB!\n";
}

/**
 * Klasse C erweitert Klasse B
 **/
class extends B
{
        var 
$propertyC "Ich bin die Eigenschaft C::propertyC!\n";

        function 
showProperties()
        {
                echo 
$this->propertyA;
                echo 
$this->propertyB;
                echo 
$this->propertyC;
        }
}

/**
 * Instanz von C erstellen.
 * Da C die Klasse B erweitert und diese wiederum die Klasse A
 * werden alle Klassen in einer Instanz vereint.
 **/
$obj = new C;
$obj->showProperties();
?>
Ausgabe ist:
Code:
Ich bin die Eigenschaft A::propertyA!
Ich bin die Eigenschaft B::propertyB!
Ich bin die Eigenschaft C::propertyC!
Edit: fast hätt ichs vergessen
http://www.php.net/manual/de/language.oop.php

  #5  
Alt 24.02.2004, 10:09
Mitglied
 
Registriert seit: 06.2003
Beiträge: 64
Geht das auch, in dem es eine Oberklassse und mehrere Unterklassen gibt oder nur mit deiner Methode (eine Klasse erweitert immer eine andere)?

Zitat:
Das in A::example() dies getan wird bringt dir nichts, da diese Methode ja nicht aufgerufen wird.
Sie wird doch aufgerufen.

PHP-Code:
$a->example(); 

  #6  
Alt 24.02.2004, 11:10
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888
Zitat:
Zitat von Erazor
Geht das auch, in dem es eine Oberklassse und mehrere Unterklassen gibt oder nur mit deiner Methode (eine Klasse erweitert immer eine andere)?
Du kannst eine Oberklasse natürlich von mehreren Unterklassen aus verwenden, solange diese Unterklassen die Oberklasse erweitern. Wenn du aber die Eigenschaften und Methoden mehrer Klassen in einem Objekt haben wilst muss eine Klasse immer die andere erweitern, du erstellst also einen Vererbungsbaum in dem eine Klasse immer die vorherige weiter spezialisiert - bis du bei deiner Endklasse angekommen bist von der du dann ein Objekt via $objekt = new klasse; ableitest.


Zitat:
Sie wird doch aufgerufen.

PHP-Code:
$a->example(); 
Wird sie schon, spielt hier aber keine Rolle.
Wenn du mit $this->xyz auf eine Eigenschaft oder Methode zugreifst so bezieht sich das auf eine Eigenschaft oder Methode innerhalb des eigenen Objekts.
Da die Klasse C in deinem Code-Beispiel aber nur in der Eigenschaft $a->c als Objekt abgeleitet ist greifst du mit $this->b vom Objekt $a->c nicht auf die Eigenschaft $a->b zu sondern auf die Eigenschaft 'b' im Objekt $a->c, also auf $a->c->b, was aber bis dahin nicht als Objekt definiert wurde.
Folglich schlägt der Aufruf $a->c->b->example() mit "Call to a member function on an non-object" fehl.

Antwort


Stichworte
-

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24