Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   [PHP]Zugriff von einer Unterklasse auf eine andere (https://boardunity.de/php-zugriff-unterklasse-andere-t1445.html)

Erazor 23.02.2004 20:54

[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?

Patrick Gotthardt 23.02.2004 21:15

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.

Erazor 23.02.2004 21:59

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


exe 23.02.2004 23:35

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

Erazor 24.02.2004 10:09

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(); 


exe 24.02.2004 11:10

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.

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