Probleme Geltungsbereich von Variablen
Bobby
- php
0 Robert B.0 Bobby
0 Christian Kruse0 Bobby0 Felix Riesterer
0 Bobby
0 lska
Moin
irgendwie steh ich grad auf dem Schlauch:
ich habe 2 Klassen. Model() und BasicDb()
Model ist die Model() erbt von BasicDb(). In Model() erstelle ich im Konstruktor eine Variable $this->queryVars(). Dies ist ein Objekt. Ich dachte So. nun habe ich eine Methode im Model wie zum Beispiel getEntryById(). in dieser Methode kopiere ich die globale QueryVars-variable. $queryVars=$this->queryVars;
Nun rufe ich die EltrnMethode (aus der BasicDb), zum Beispiel parent::createQuery() auf und übergebe die Variable $queryVars (nicht $this->queryVars!). Dort werte ich die übrgebene Variable aus und erzeuge zum Beispiel ein Select auf die Datenbank.
Soweit so gut. Nun aber rufe ich eine andere Methode im Model auf. Zum Beispiel getByName(). In dieser kopiere ich wieder die $this->queryVars-Variable. Nun staune ich, dass die $this->QueryVars nun der $queryVars-Variable aus der vorher aufgerufenen Variable entspricht.
Das dürfte doch gar nicht sein. Oder habe ich einen Denkfehler?
Für sachdienliche Hinweise wäre ich sehr dankbar
Gruß Bobby
Moin,
werden in PHP nicht standardmäßig nur Objektreferenzen kopiert? Vielleicht möchtest du lieber deine Objekte klonen?
Viele Grüße,
Robert
Moin
werden in PHP nicht standardmäßig nur Objektreferenzen kopiert? Vielleicht möchtest du lieber deine Objekte klonen?
Danke. Den Fakt hatte ich vergessen. Die Erinnerung kam nach Absenden des Beitrages. Clone() funktioniert natürlich.
Danke
Gruß Bobby
Moin Bobby,
[… $this->QueryVars wird kopiert in $QueryVars und dann verändert …]
Soweit so gut. Nun aber rufe ich eine andere Methode im Model auf. Zum Beispiel getByName(). In dieser kopiere ich wieder die $this->queryVars-Variable. Nun staune ich, dass die $this->QueryVars nun der $queryVars-Variable aus der vorher aufgerufenen Variable entspricht.
In PHP werden Objekte (seit Version 4 IIRC) immer „by reference“ übergeben (es sind nicht wirklich technisch PHP-Referenzen, aber praktisch kann man das so vereinfachen – wenn dich die technischen Details interessieren, schau dir http://php.net/manual/en/language.oop5.references.php an). Das bedeutet, dass Änderungen, die du in einer Funktion machst, die das Objekt per Parameter bekommt, auch außerhalb der Funktion sichtbar sind. Wenn du das verhindern willst, musst du eine Kopie erzeugen.
Ansonsten noch ein kleiner Rat: verschwende deine Zeit nicht darauf, ein eigenes ORM zu schreiben. Benutze ein bereits existierendes.
LG,
CK
Moin
In PHP werden Objekte (seit Version 4 IIRC) immer „by reference“ übergeben (es sind nicht wirklich technisch PHP-Referenzen, aber praktisch kann man das so vereinfachen – wenn dich die technischen Details interessieren, schau dir http://php.net/manual/en/language.oop5.references.php an). Das bedeutet, dass Änderungen, die du in einer Funktion machst, die das Objekt per Parameter bekommt, auch außerhalb der Funktion sichtbar sind. Wenn du das verhindern willst, musst du eine Kopie erzeugen.
Danke... Die Erinnerung an den Fakt kam nach dem Absenden des Beitrages von selbst... mit clone() funktionierts. ;)
Ansonsten noch ein kleiner Rat: verschwende deine Zeit nicht darauf, ein eigenes ORM zu schreiben. Benutze ein bereits existierendes.
Es passt schon. Stell nur grad um. Bisher alles in Stringelementen zusammen gesetzt. Nun läuft es objektorientiert. Und es funktioniert wunderbar.
Gruß Bobby
Lieber Bobby,
Stell nur grad um. Bisher alles in Stringelementen zusammen gesetzt. Nun läuft es objektorientiert.
das kommt mir so bekannt vor... ;-)
Liebe Grüße,
Felix Riesterer.
Moin
das kommt mir so bekannt vor... ;-)
na da erzähl mal von deinen Erfahrungen. Kann ich ja nur von profitieren.
Ich habe im Prinzip alle Datenbankoprationen abgefangen und so zusammengestellt wie ich dies benötige. Ich muss nun nur noch das Abfrageobjekt zusammenbasteln und an die BasicDB Klasse übergeben. Den Rest macht diese. ;)
Gruß Bobby
Vielleicht hilft die Doc. ja http://php.net/manual/de/language.variables.scope.php