Bobby: Probleme Geltungsbereich von Variablen

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

--
-> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
### Henry L. Mencken ###
-> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
### Viktor Frankl ###
ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  1. Moin,

    werden in PHP nicht standardmäßig nur Objektreferenzen kopiert? Vielleicht möchtest du lieber deine Objekte klonen?

    Viele Grüße,
    Robert

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

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ### Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  2. 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

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

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ### Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. 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.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. 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

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          ### Henry L. Mencken ###
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ### Viktor Frankl ###
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  3. Vielleicht hilft die Doc. ja http://php.net/manual/de/language.variables.scope.php