PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : __construct() in Vererbter Klasse



Torsten.E
22-04-2004, 15:59
Ja ich weis, ich frag hier Löcher.
Aber wie macht man das mit der __construct() funktion
wenn man Klassen erbt. Dann ist die Funktion ja 2 mal
vorhanden und schließt die 1. ja aus.

Nicht das einer denkt ich bekomme Geld dafür
dass ich Gaert hier so viel frage ;-)

Torsten.E



class adressen {

var $Name;

function adressen() {
// PHP4
$this->__construct();
}

function __construct() {
// PHP5
$this->$Name = "Torsten.E";
}

........

class kunden extends adressen {

var $KdNr;

function kunden() {
// PHP4
$this->__construct();
}

function __construct() {
// PHP5
$this->KdNr = "123";
}

..............

sixfriends
22-04-2004, 16:30
Habs nicht getestet, aber:

parent::__construct();

Torsten.E
22-04-2004, 16:34
Ich will ja keine Parent Funktion aufrufen.

Schau das Beispiel an, es werden unterschiedliche Variablen
initialisiert, da ja die vererbte Klasse eine neue Variable "$KdNr"
hat.

Torsten.E

Gaert
22-04-2004, 16:53
Hallo,

mit PHP 5 würdest du den Konstruktor der Klasse von der du erbst mit

parent::__construct()

aufrufen

In PHP 4 gibt es derartiges parent noch nicht (glaube mich zu erinnern), deshalb müsstest du dir in deinem Beispiel mit:

class kunden extends adressen {

var $KdNr;

function kunden() {
// PHP4
$this->__construct();
}

function __construct() {
// PHP5
// Parent Konstruktor für PHP4:
$this->adressen();
// Parent Konstruktor für PHP5:
//parent::__construct();

$this->KdNr = "123";
}
aufrufen...

Da hat sich bei PHP5 halt einiges geändert...

undefined
22-04-2004, 18:12
:confused: Der Konstruktor wird bei einer Vererbung doch ohnehin angesprochen.
Zudem hast du hier etwas misch masch. Der Compiler müste bei der Methoden definition ohne ende Meckern ;)



class vater
{
protected $Daddy;

function __construct()
{
$this->Daddy = "Vater";
}

protected function zurueck($in)
{
if ($in == $this->Daddy)
return $this->Daddy;
}

function __destruct()
{
$this->Daddy = "";
}
}

class tochter extends vater
{
public $Name;

function __construct()
{
$this->Name = "Vater";
}

public function test()
{
return parent::zurueck($this->Name);
}

}//end
http://www.php.net/zend-engine-2.php

Gaert
22-04-2004, 21:05
Das Mischmasch ist beabsichtigt - ich gehe davon aus, dass er PHP4 verwendet - bei PHP 4 lautet der Kunstrukor "klassenname()" - um das ganze auch mit PHP 5 kompatibel zu halten musst du die komplette Konstruktorfunktionalität in __construct() auslagern, da der PHP4 Konstruktor in PHP5 ja nicht mehr ausgeführt wird. Damit das ganze dann unter PHP4 funktioniert rufst du daher den PHP5 Konstruktor aus dem PHP4 Konstruktor auf.
Der Konstruktor der Vaterklasse wird AFAIK nie automatisch aufgerufen.

Siehe auch:
http://zend.com/php5/articles/engine2-php5-changes.php
http://zend.com/php5/articles/engine2-php-oo.php

sixfriends
23-04-2004, 00:39
parent:: existiert auch in PHP4 (steht auch so im Manual auf php.net)
Aufrufe der Konstruktoren in PHP4:
Wenn keiner in der erbenden Klasse existiert: der der vererbenden Klasse, ansonsten: nur der Konstruktor der erbenden Klasse
Weitere Infos: http://www.php.net/manual/de/language.oop.constructor.php

Im übrigen funktioniert das ganze so wie beschrieben.
Wenn ich eine Variable in der vererbenden Klasse definiere, existiert diese auch in der erbenden. Und wenn ich mit der erbenden Klasse den Parent Konstruktor aufrufe, ist das so, als würde der Parent Konstruktor in der erbenden Klasse stehen (Das ist schliesslich auch der Sinn von Vererbung). Kann man auch ganz leicht mit folgendem Codeschnipsel testen:

<?php
class adressen {
var $Name;

function adressen() {
// PHP4
$this->__construct();
}

function __construct() {
// PHP5
$this->Name = "Torsten.E";
}
}

class kunden extends adressen {
var $KdNr;

function kunden() {
// PHP4
$this->__construct();
}

function __construct() {
// PHP5
parent::__construct();
$this->KdNr = "123";
}
}
$test = new kunden();
echo $test->Name;
?>

btw: $this->$Name = kommt nicht so gut. ;)
... und ausserdem hat die vererbte Klasse eine neue Variable "Name" :p
sixfriends

Gaert
23-04-2004, 08:02
Original geschrieben von sixfriends
parent:: existiert auch in PHP4 (steht auch so im Manual auf php.net)
Aufrufe der Konstruktoren in PHP4

Ok, da hast du mich erwischt - ich hab die letzte Zeit zu viel mit PHP5 gemacht und leugne schon die PHP4 Funktionalität ;)


Original geschrieben von sixfriends
Im übrigen funktioniert das ganze so wie beschrieben.
Wenn ich eine Variable in der vererbenden Klasse definiere, existiert diese auch in der erbenden. Und wenn ich mit der erbenden Klasse den Parent Konstruktor aufrufe, ist das so, als würde der Parent Konstruktor in der erbenden Klasse stehen (Das ist schliesslich auch der Sinn von Vererbung).

Das hat ja auch niemand bezweifelt, oder?



Original geschrieben von sixfriends
btw: $this->$Name = kommt nicht so gut. ;)

Stimmt...


Original geschrieben von sixfriends
... und ausserdem hat die vererbte Klasse eine neue Variable "Name"

Verstehe nicht ganz was du meinst - die Variable Name existiert nur in der Klasse von der vererbt wird.

Gruß,

Gaert

sixfriends
23-04-2004, 15:24
Original geschrieben von Gaert
die Variable Name existiert nur in der Klasse von der vererbt wird.
bezog sich auf folgendes:

Orginal geschrieben von Thorsten.E
da ja die vererbte Klasse eine neue Variable "$KdNr"
hat.

Im übrigen ist für mich die vererbte Klasse das selbe wie die Klasse, von der vererbt wird (noch nicht ganz wach gewesen?? :D)