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()
Ankündigung
Einklappen
Keine Ankündigung bisher.
Objekte
Einklappen
Neue Werbung 2019
Einklappen
X
-
Ein Gast antworteteJetzt 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.
-
Ein Gast antworteteIch verstehe immer noch nicht, was Du meinst. Aber Du wirst schon Recht haben.
Einen Kommentar schreiben:
-
Ein Gast antworteteVielen 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.
Einen Kommentar schreiben:
-
Ein Gast antworteteStimme 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:Wie meinen?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?
Einen Kommentar schreiben:
-
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)
Einen Kommentar schreiben:
-
Ein Gast antworteteHier 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 !!!
}
}
Einen Kommentar schreiben:
-
Ein Gast antworteteDas ist der jetztige Zustannd auf den immer nochMittlerweile übergebe ich das Objekt ($mySession) immer an
das neue Objekt bzw. dessen Konstruktor und darin
heisst es dann: $this->mySession=$uebergebenesSessionObjekt;zutrifft?Und da will er immer eine neue Session öffnen!
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.
Einen Kommentar schreiben:
-
Ein Gast antworteteEigentlich 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;
Einen Kommentar schreiben:
-
Ein Gast antworteteBin 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;
?>Was ist an Deinem Fall anders?PHP-Code:<?php //DateiC.php
$foo->bar();
?>
Einen Kommentar schreiben:
-
Ein Gast antworteteDanke.
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?
Einen Kommentar schreiben:
-
Ein Gast antworteteVermutlich 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
Einen Kommentar schreiben:
-
Ein Gast antwortetezur 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!
Einen Kommentar schreiben:

Einen Kommentar schreiben: