Vererbung von Variablen in Klassen
Guten PreAbend,
Ich habe ein Problem mit 2 Klassen. Ich habe eine Klasse A und eine B (B extends A).
In Klasse A rufe ich eine Methode aus B auf. Aus der Methode B greife ich auf "Get Methoden" von A zu.
Problem: In Klasse A werden Variablen gespeichert die auch für die "Get Methoden" nötig sind. Aber wenn ich die "Get Methoden" aufrufe aus B sind diese nicht mehr vorhanden. Aus A aber schon (direkt davor und da nach geprüft).
Das Problem ist hier das die Variablen die in GetVar gespeichert werden nicht in der Methode add ausgegeben werden weil diese aus Klasse B aufgerufen wird. Ich stehe da gerade etwas auf dem Schlauch.
Gruß
Sven
Ich habe ein Problem mit 2 Klassen. Ich habe eine Klasse A und eine B (B extends A).
In Klasse A rufe ich eine Methode aus B auf. Aus der Methode B greife ich auf "Get Methoden" von A zu.
Problem: In Klasse A werden Variablen gespeichert die auch für die "Get Methoden" nötig sind. Aber wenn ich die "Get Methoden" aufrufe aus B sind diese nicht mehr vorhanden. Aus A aber schon (direkt davor und da nach geprüft).
class A{
protected $Variable = 1;
protected $Z = 1;
public function GetVar(){
echo $this->Z. " # ". $this->Variable. "<br/>";
// DIese Variablen sind Klasse B nicht bekannt
$this->Variable = 2;
$this->Z = 2;
$B = new B();
$B->B();
}
public function add(){
// Gibt 1 # 1 aus
echo $this->Z ." # ". $this->Variable;
}
}
class B extends A{
public function B(){
$this->add();
}
}
$A = new A();
$A->GetVar();
Das Problem ist hier das die Variablen die in GetVar gespeichert werden nicht in der Methode add ausgegeben werden weil diese aus Klasse B aufgerufen wird. Ich stehe da gerade etwas auf dem Schlauch.
Gruß
Sven
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 217554
Url: https://administrator.de/forum/vererbung-von-variablen-in-klassen-217554.html
Ausgedruckt am: 22.12.2024 um 06:12 Uhr
10 Kommentare
Neuester Kommentar
Hallo Sven,
das kommt daher das du in Zeile 12 ein neues Objekt B erzeugst in dem
die Variablen mit Standard-Werten "1" geladen werden.
So wie du es haben willst ginge es so:
Grüße Uwe
das kommt daher das du in Zeile 12 ein neues Objekt B erzeugst in dem
die Variablen mit Standard-Werten "1" geladen werden.
So wie du es haben willst ginge es so:
class A{
protected $Variable = 1;
protected $Z = 1;
public function GetVar(){
echo $this->Z. " # ". $this->Variable. "<br/>";
// DIese Variablen sind Klasse B nicht bekannt
$this->Variable = 2;
$this->Z = 2;
$this->B();
}
public function add(){
// Gibt 1 # 1 aus
echo $this->Z ." # ". $this->Variable;
}
}
class B extends A{
public function B(){
$this->add();
}
}
$B = new B();
$B->GetVar();
Grüße Uwe
Zitat von @EvilMoe:
Hallo,
Danke erst einmal.
Dein Beispiel funktionier leider bei mir nicht.
Was soll das B(); in der GetVar Methode bewirken?
Sorry war ein Typo, muss natürlich Hallo,
Danke erst einmal.
Dein Beispiel funktionier leider bei mir nicht.
Was soll das B(); in der GetVar Methode bewirken?
$this->B();
heißen.
Du könntest Klasse A für die Datenbankverbindung benutzen und Klasse B als deine SQL-Statement Klasse. So hast du bei jedem Erzeugen eines Objektes der SQL Klasse auf jeden Fall die Datenbankverbindung zur Verfügung.
Bin aber im Moment nicht im Thema up to date, wie immer führen viele Wege nach Rom
Als Anregung kannst du dir ja mal ein OpenSource-CMS im Quellcode anschauen und nachsehen wie andere das so machen.
Grüße Uwe
Bin aber im Moment nicht im Thema up to date, wie immer führen viele Wege nach Rom
Als Anregung kannst du dir ja mal ein OpenSource-CMS im Quellcode anschauen und nachsehen wie andere das so machen.
Grüße Uwe
steht alles hier schön beschrieben:
http://php.net/manual/de/language.oop5.decon.php
http://php.net/manual/de/language.oop5.decon.php
Zitat von @EvilMoe:
Das ist mir schon klar, nur müsste ich immer in jeder Methode die Datenbank Verbindung herstellen.
Daher die Frage ob es eine Möglichkeit gibt dies abzufangen, dann bräuchte ich das nicht jedes mal schreiben.
Das ist mir schon klar, nur müsste ich immer in jeder Methode die Datenbank Verbindung herstellen.
Daher die Frage ob es eine Möglichkeit gibt dies abzufangen, dann bräuchte ich das nicht jedes mal schreiben.
Hi EvilMoe,
eine Klasse kann auch eine Funktion/Methode beinhalten, die sich Konstruktor nennt. Dieser Konstruktor wird automatisch
aufgerufen, wenn ein neues Objekt initialisiert wird. Der Name der Methode kann der Klassenname selber sein. Ab einer
bestimmten PHP-Version, frag' mich nicht welche, kann auch eine Funktion namens __construct definiert werden, um Klassenvariablen
beim Erstellen eines Objekts zu initialisieren. Du brauchst also in deiner abgeleiteten Klasse nicht jedes Mal die DB-Verbindung aufzubauen,
denn das erledigt ja die Klasse, von der du eine andere Klasse ableitest. Beispiel . . .
<code type = "PHP">
<?php
class myConnection{
protected $conn;
public function __construct(){
$this->conn = new PDO("mysql:host=localhost;dbname=test", "guenni", "guenni");
}
}
class myQuery extends myConnection{
private $stm;
public function query(){
$this->stm = $this->conn->prepare('select * from tabelle5');
$this->stm->execute();
$result = $this->stm->fetchAll(PDO::FETCH_ASSOC);
return $result; $result enthält ein Array der Abfrage
}
}
?>
<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 TransitionalEN">
<html>
<head>
<title>Untitled</title>
<META content="text/html; charset=utf-8" http-equiv=Content-Type>
<script src="jquery-1.10.1.js" type="text/javascript"></script>
</head>
<body>
<?php
$query = new myQuery;
echo "<pre>";
print_r($query->query());
echo "</pre>";
?>
</body>
</html>
Gruss
Günni