Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Vererbung von Variablen in Klassen

Frage Entwicklung PHP

Mitglied: EvilMoe

EvilMoe (Level 2) - Jetzt verbinden

21.09.2013, aktualisiert 17:29 Uhr, 1927 Aufrufe, 10 Kommentare, 1 Danke

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).

01.
class A{ 
02.
	protected $Variable	= 1; 
03.
	protected $Z		= 1; 
04.
	 
05.
	public function GetVar(){ 
06.
		echo $this->Z. " # ". $this->Variable. "<br/>";	 
07.
		 
08.
		// DIese Variablen sind Klasse B nicht bekannt 
09.
		$this->Variable = 2; 
10.
		$this->Z 		= 2; 
11.
		 
12.
		$B = new B(); 
13.
		$B->B(); 
14.
15.
	 
16.
	public function add(){ 
17.
                // Gibt 1 # 1 aus  
18.
		echo $this->Z ." # ". $this->Variable; 
19.
20.
21.
 
22.
 
23.
class B extends A{ 
24.
	 
25.
	public function B(){ 
26.
		$this->add(); 
27.
28.
	 
29.
30.
 
31.
$A = new A(); 
32.
$A->GetVar(); 
33.
 


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
Mitglied: colinardo
21.09.2013, aktualisiert um 19:48 Uhr
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:

01.
class A{ 
02.
	protected $Variable	= 1; 
03.
	protected $Z		= 1; 
04.
	 
05.
	public function GetVar(){ 
06.
		echo $this->Z. " # ". $this->Variable. "<br/>";	 
07.
		 
08.
		// DIese Variablen sind Klasse B nicht bekannt 
09.
		$this->Variable = 2; 
10.
		$this->Z 		= 2; 
11.
		$this->B(); 
12.
13.
	 
14.
	public function add(){ 
15.
                // Gibt 1 # 1 aus  
16.
		echo $this->Z ." # ". $this->Variable; 
17.
18.
19.
 
20.
 
21.
class B extends A{ 
22.
	 
23.
	public function B(){ 
24.
		$this->add(); 
25.
26.
	 
27.
28.
 
29.
$B = new B(); 
30.
$B->GetVar();
Grüße Uwe
Bitte warten ..
Mitglied: EvilMoe
21.09.2013, aktualisiert um 19:44 Uhr
Hallo,

Danke erst einmal.

Dein Beispiel funktionier leider bei mir nicht.
Was soll das B(); in der GetVar Methode bewirken?


Mal anders erklärt, vielleicht habt Ihr auch eine bessere Idee.

Ich habe eine Upload Klasse(Klasse A), nun fehlt noch die Datenbank Anbindung. Ich wollte dafür eine extra Klasse bauen wo ich dann alle SQL Statements zusammen habe (Klasse B).
Nun brauche ich in der Klasse für die SQL Statements natürlich viele Variablen aus der Upload Klassen, alles über Parameter zu übergeben möchte ich auch nicht.


Sven
Bitte warten ..
Mitglied: colinardo
21.09.2013 um 19:52 Uhr
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 $this->B(); heißen.
Bitte warten ..
Mitglied: EvilMoe
21.09.2013, aktualisiert um 20:00 Uhr
Ich verstehe deine Lösung, ohne zu probieren würde ich sagen das es auch funktioniert.

Aber ist es die einzige Möglichkeit?
Die Klassen habe ich nämlich anders programmiert, so rum müsste ich wahrscheinlich ein paar Anpassungen machen.


EDIT: Mir fällt gerade ein, wenn ich Statt "database extends upload" den Spieß umdrehe "upload extends database" müsste es doch auf das selbe hinauslaufen oder?
Bitte warten ..
Mitglied: colinardo
21.09.2013 um 20:18 Uhr
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
Bitte warten ..
Mitglied: EvilMoe
21.09.2013 um 20:25 Uhr
Danke für Deine Hilfe!

Ich habe es nun so gemacht wie ich dachte, "upload extends database". Das führt zum selben Ergebnis ohne das ich die Klassen umschreiben muss ;)

Eine andere Frage wenn ich schon dabei bin. Im Konstruktor der DB Klasse stelle ich die Verbindung her.
Gibt es eine möglich das der Konstruktor aufgerufen wird nur wenn ich eine Methode aufrufe? Kann man den Aufruf einer Methode abfangen irgendwie?
Bitte warten ..
Mitglied: colinardo
21.09.2013 um 20:37 Uhr
Pack die Datenbankverbindung einfach in eine Function in der Klasse database. Dann kannst du selber entscheiden wann die Verbindung hergestellt werden soll Bsp.: $db->connect()
Bitte warten ..
Mitglied: EvilMoe
21.09.2013 um 20:58 Uhr
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.
Bitte warten ..
Mitglied: colinardo
21.09.2013 um 21:03 Uhr
steht alles hier schön beschrieben:
http://php.net/manual/de/language.oop5.decon.php
Bitte warten ..
Mitglied: Guenni
22.09.2013 um 00:55 Uhr
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.

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 . . .

01.
<?php 
02.
class myConnection{ 
03.
 protected $conn; 
04.
 public function __construct(){ 
05.
  $this->conn = new PDO("mysql:host=localhost;dbname=test", "guenni", "guenni"); 
06.
07.
08.
 
09.
class myQuery extends myConnection{ 
10.
 private $stm; 
11.
 public function query(){ 
12.
  $this->stm = $this->conn->prepare('select * from tabelle5'); 
13.
	$this->stm->execute(); 
14.
	$result = $this->stm->fetchAll(PDO::FETCH_ASSOC); 
15.
	return $result; //$result enthält ein Array der Abfrage  
16.
17.
}   
18.
?> 
19.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
20.
<html> 
21.
<head> 
22.
<title>Untitled</title> 
23.
<META content="text/html; charset=utf-8" http-equiv=Content-Type> 
24.
<script src="jquery-1.10.1.js" type="text/javascript"></script> 
25.
</head> 
26.
<body> 
27.
<?php  
28.
$query = new myQuery; 
29.
echo "<pre>"; 
30.
print_r($query->query()); 
31.
echo "</pre>"; 
32.
?> 
33.
</body> 
34.
</html>
Gruss
Günni
Bitte warten ..
Ähnliche Inhalte
JavaScript
JQuery, neue Klasse an vorhandene Klasse hängen.
gelöst Frage von d4shoerncheNJavaScript4 Kommentare

Guten Tag, ich erstelle gerade eine neue Webpräsenz für unseren Verein und setze dort Joomla ein. In Joomla bekommt ...

Windows Userverwaltung
ACL - Vererbung
gelöst Frage von TlBERlUSWindows Userverwaltung8 Kommentare

Guten Morgen, ich schreibe zur Zeit ein Powershell-Skript, um Berechtigungen zu vergeben. Dabei bin ich entsprechend auf Inheritance-Flags gestoßen. ...

C und C++
CoMarshalInterface Klasse nicht registriert
Frage von runner-ralfC und C++2 Kommentare

Hallo alle zusammen, Ich habe ein Programm das beim Starten folgenden Fehler ausspuckt. Schwerwiegender interner Fehler: CoMarshalInterface Klasse nicht ...

Windows Server
Vererbung deaktivieren zieht nicht (GPO)
Frage von patrickebertWindows Server8 Kommentare

Moin, ich bin mal wieder am testen und zwar habe ich folgendes Problem in der Gruppenrichtlinienverwaltung. Wie Ihr vielleicht ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 107 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless8 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Ping auf einen bestimmten Server nicht möglich
gelöst Frage von a.thierWindows Server7 Kommentare

Hallo, ich habe folgendes Problem. srv-dc1: Ping srv-nav > geht Ping srv-exchange > geht nicht srv-exchange: Ping srv-dc1 > ...