Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekte

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekte

    Hallo!

    Ein Beispiel:

    Ich erzeuge ein Objekt "mySession"* ganz zu Beginn des Programmlaufs.
    Anschließend werden weitere Objekte erzeugte, teilweise auf Klassen die
    in anderen Dateien liegen, und in einem dieser möchte
    ich auf Session-Variablen zugreifen. "mySession" bekomme ich nicht mehr.

    *Dahinter verbirgt sich im betroffenen Konstruktur ein normales session_start().

    Meine Fragen:
    Wie kann ich das Objekt weitergeben bzw. was muss ich beachten?
    bzw.
    Wenn ich erneut so ein Objekt "mySession" erzeuge, komme ich dann zwar
    auch an meine Session-Variablen bzw. - Werte ran, aber er meldet auch:
    Notice: A session had already been started - ignoring session_start()

  • #2
    zur Veranschaulichung

    in der index.php:
    require_once(Session.class.php);
    require_once(Main.class.php);


    $mySession=Session()

    dann erst das erste Objekt:
    new Main($abc);

    In der Main wird, je nach $abc, ein weiteres Objekt erzeugt
    und erst in diesem benötige ich Werte aus der Session.
    Kann ich hier dann noch $mySession nutzen?

    DANKE!

    Kommentar


    • #3
      Vermutlich ja.
      Es gibt zwar das Thema Geltungsbereich bei php. Das bezieht sich aber nicht auf Dateigrenzen - die sind php egal.

      Weitere Erklärung: http://www.php.net/manual/de/languag...bles.scope.php

      Kommentar


      • #4
        Danke.

        Wie ich zwischenzeitlich herausbekommen habe, kann ich das Objekt auch
        ganz klassisch übergeben - z.B. dem Konstruktor der Klasse, in dem ich es
        zukünftig verwenden will.

        Ein Beispiel aus Deinem Verweis:
        <?php
        function test_global_ref() {
        global $obj;
        $obj = &new stdclass;
        }

        function test_global_noref() {
        global $obj;
        $obj = new stdclass;
        }

        test_global_ref();
        var_dump($obj);
        test_global_noref();
        var_dump($obj);
        ?>

        Ausgabe:
        NULL
        object(stdClass)(0) {
        }

        hört sich sehr gut an, nur leider scheint es ja nicht richtig zu klappen?
        Aber ein globales Objekt für mein $mySession wäre toll.

        Gibt es vielleicht eine Variante, dass das doch klappt?

        Kommentar


        • #5
          Bin mir nicht sicher, ob wir aneinander vorbeireden.

          Das geht:
          PHP-Code:
          <?php
          require 'DateiA.php';
          require 
          'DateiB.php';
          require 
          'DateiC.php';
          ?>
          PHP-Code:
          <?php // DateiA.php
          class foo {
              function 
          bar()     {
                  echo 
          'bar:'time();
              }
          }
          ?>
          PHP-Code:
          <?php // DateiB.php
          $foo = new foo;
          ?>
          PHP-Code:
          <?php //DateiC.php
          $foo->bar();
          ?>
          Was ist an Deinem Fall anders?

          Kommentar


          • #6
            Eigentlich sieht es meiner Konstellation sehr ähnlich.

            in DateiB und - damit geht es los! - erzeuge ich ein Objekt,
            dessen Klassendef. z.B. in DateiA, (z.B. $foo) steht.
            Konkret: $mySession=new Session();

            Dann erzeuge ich ein Objekt,
            dessen Klassendef. z.B. in DateiB steht
            und will in einer private function(), dieser Klasse, das
            1. Objekt (z.B. $foo) mit einer Funktionaufrufen
            Konkret: $this->mySession->get('VarName');

            Und da will er immer eine neue Session öffnen!

            Hätte ich es nur über $mySession ansprechen müssen?


            Mittlerweile übergebe ich das Objekt ($mySession) immer an
            das neue Objekt bzw. dessen Konstruktor und darin
            heisst es dann: $this->mySession=$uebergebenesSessionObjekt;

            Kommentar


            • #7
              Mittlerweile übergebe ich das Objekt ($mySession) immer an
              das neue Objekt bzw. dessen Konstruktor und darin
              heisst es dann: $this->mySession=$uebergebenesSessionObjekt;
              Das ist der jetztige Zustannd auf den immer noch
              Und da will er immer eine neue Session öffnen!
              zutrifft?

              Wenn möglich, den Code soweit vereinfachen, dass Du ihn hier posten kannst und der Fehler trotzdem noch in der Form auftritt. Sonst wird das hier wieder Hellsehen für Fortgeschrittene.

              Kommentar


              • #8
                Hier noch eine kleine Verdeutlichung meiner Konstruktion.
                Das Problem ist, er erkennt mein einmal erstelltes Objekt $mySession
                nicht mehr. Liegt es daran, dass die Erzeugung in der allerersten
                Datei passiert, die ja noch nicht mit Class eingeleitet wird, da ich
                ja nicht direkt OOP losprogrammieren kann?

                File a.php, wird zuerst aufgerufen)
                --Anfang
                require_once(ROOT.'session.php');
                require_once(ROOT.'main.php');

                $mySession=new Session();

                session.php beinhaltet:
                class Session {
                public function __construct() {
                // Startet Session
                session_start();
                }
                }

                dann:
                new main in b ();
                --Ende von a.php

                main.php beinhaltet:
                class Main {
                public function __construct() {
                ...this-> function xyz();
                }

                public function xyz() {
                $mySession->...();
                // Das funktioniert dann nicht mehr
                // er kennt das Objekt nicht mehr !!!
                }
                }

                Kommentar


                • #9
                  nun, $mySession ist ja auch keine superglobale. Du vergisst, dass in funktionen die anderen variablen nicht gelten. Du musst vorher

                  global $mySession;

                  schreiben (also in der funktionen xyz ganz am anfang)

                  Kommentar


                  • #10
                    Stimme Buhmann zu. Damit beschäftigt sich http://www.php.net/manual/de/languag...bles.scope.php und dann unterscheiden sich mein Beispiel und Deine Situation eben um den Umstannd, dass der Aufruf aus einer Funktion heraus stattfindet.

                    Verstehe aber diesen Satz nicht:
                    Liegt es daran, dass die Erzeugung in der allerersten Datei passiert, die ja noch nicht mit Class eingeleitet wird, da ich
                    ja nicht direkt OOP losprogrammieren kann?
                    Wie meinen?

                    Kommentar


                    • #11
                      Vielen Dank für die Antworten!

                      @Buhmann: Wenn ich $mySession zu einer Super-Globalen machen muss, habe ich damit auch alle Probleme mit den Referenzen, wie im Link von Bruchpilot beschrieben, oder?

                      Gilt also - nur zu meiner Sicherheit - : Normale Objekte gelten in anderen Funktionen nicht automatisch, sondern erst durch Übergabe oder wenn man ihnen den Status global vergibt?

                      @Bruchpilot: Zum Zitat: Wenn ich eine Seite z.B. index.php erstmalig aufrufe, kann ich ja nicht direkt mit OOP beginnen - i.G. z.B. zu Java. Stattdessen muss ich hier erstmalig ein Objekt erzeugen. Nun war meine Vermutung, dass es daran liegen könnte, da dadurch das Session-Objekt nicht innerhalb eines Objekts erzeugt wurde.

                      Kommentar


                      • #12
                        Ich verstehe immer noch nicht, was Du meinst. Aber Du wirst schon Recht haben.

                        Kommentar


                        • #13
                          Jetzt noch ein Nachtrag - es fiel mir gerade wie Schuppen von den Augen.

                          Die Ausführungen von Buhmann sind nicht zutreffend.
                          Wir reden hier nicht von Variablen sondern von Objekten.

                          Es bleibt nur die Übergabe des Objekts normal, als Aggregation oder Komposition.

                          Kommentar

                          Lädt...
                          X