2 Stimmen

PHP-Klassen: Eltern-Kind-Kommunikation

Ich habe einige Probleme bei der Erweiterung von Klassen in PHP. Habe schon eine Weile gegoogelt.

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

 $a->two();
 // something like this, or...

 class A {
  public $test1;

   public function one() {
    echo "this is A-one";

    $this->two();
    $parent->two();
    $parent->B->two();
    // ...how do i do something like this (prepare it for using in instance $a)?

   }
 }

 class B extends A {
   public $test2;

    public function two($test) {
     echo "this is B-two";

    }
 }

Ich bin gut in prozeduralem PHP.

1 Stimmen

Können Sie genau erklären, was Sie zu erreichen hoffen, wenn Sie fertig sind? Es sieht so aus, als ob Sie vielleicht versuchen, mit der Vererbung etwas zu erreichen, wofür sie nie gedacht war....

0 Stimmen

Hallo, danke. - ich möchte auf die Funktion two() von der Instanz a zugreifen. - möchte, dass $this-> in allen Klassen auf die Instanz a verweist. (+ hat den dritten Befehl bearbeitet) ist das eine Beschreibung, mit der man etwas anfangen kann? Danke, Frank

2 Stimmen

Das ist nicht die Art der Vererbung/ extends funktioniert, Fffff. class B extends A definiert eine neu Klassentyp, B die alle Funktionen von A hat, aber auch alle neuen Dinge, die Sie zu B . Es macht nicht A mehr Dinge drin haben.

2voto

Jasper Punkte 10923

Das kann man nicht machen. Erstens, Klasse A ist Klasse B's Elternteil, so mit etwas mit Elternteil ist rechts von der Liste.

Es gibt eine Reihe von Dingen, die für eine Kinderklasse gelten und für eine Elternklasse nicht gelten:

  • Klasse B erfordert die Anwesenheit von A, um zu funktionieren
  • Klasse B kann alles, was A kann, und noch mehr
  • Die Klasse B hat Zugriff auf alle Daten der Klasse A (soweit ihr der Zugriff erlaubt ist)

Keines dieser Dinge trifft umgekehrt zu, so dass sie zusammen den Grund dafür bilden, dass Sie die Funktion eines Kindes nicht aufrufen können.

0 Stimmen

Danke! Das würde also bedeuten, dass es normale Praxis ist, eine große übergeordnete Klasse mit vielen Funktionen zu erstellen, die Funktionen in den anderen enthaltenen Klassen aufrufen?

0 Stimmen

Nicht ganz... Sie sollten versuchen $b = new B(); $b->one(); Vielleicht ist die Tatsache, dass das funktioniert, in der Lage, Ihnen zu erklären, was Sie missverstanden haben.

2voto

Zak Punkte 24386

Ihre Beispiele sind gut, aber Sie zeigen hier ein wenig Verwirrung:

public function one() {
    echo "this is A-one";

    $this->two();
    $parent->two();
    $parent->B->two();
}

Was Sie wollen, ist Folgendes, denke ich:

class A
{
    function one()
    {
        echo "A is running one\n";
        $this->two();
    }
    function two()
    {
        echo "A is running two\n";
    }

}

class B extends A
{
    function two()
    {
        echo "B is running two\n";
    }
}

Dann wollen Sie ein Objekt vom Typ B erstellen und die Funktion "eins" aufrufen

$myB = new B();
$b->one();

Dies führt zur Ausgabe

A is running one
B is running two

Dies ist ein Beispiel für polymorphes Klassenverhalten. Die Superklasse weiß, dass sie die Version der Funktion "two" der aktuellen Instanz aufrufen muss. Dies ist ein Standardmerkmal von PHP und den meisten objektorientierten Sprachen.

Beachten Sie, dass eine Oberklasse nie etwas über Unterklassen weiß. Der einzige Grund, warum Sie die Methode "two" aufrufen und die Version von B ausführen lassen können, ist, dass die Funktion "two" in der übergeordneten Klasse (A) definiert wurde.

0voto

artlung Punkte 31996

Lesen Sie aufmerksam die Abschnitt Objektvererbung des PHP-Handbuchs. Ja, es gibt eine Menge an Informationen in http://us2.php.net/oop aber es kann Ihnen helfen, darüber nachzudenken, was Sie aus der OOP .

0voto

grossvogel Punkte 6593

Hier ist, was Sie kann tun:

class A{
  public function methodOfA (){
    echo "this is a method of A (and therefore also of B)";
  }
}

class B extends A{
  public function methodOfB (){
    echo "this is a method of B";
    // you can do {$this->methodOfA ()} if you want because all of A is inherited by B
  }
}

$a = new A ();  // $a is an A
$a->methodOfA ();     // this is OK because $a is an A
// can't do {$a->methodOfB ()} because $a is not a B

$b = new B ();  // $b is a B, and it is also an A, because B extends A
$b->methodOfB (); // ok because $b is a B
$b->methodOfA (); // ok becuase $b is an A

Natürlich gibt es noch viel mehr. Es gibt einen guten OOP-Abschnitt im php-Handbuch (in artlung's Antwort).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X