Session-Singleton funktioniert nicht mit Include-Datei

Session-Singleton funktioniert nicht mit Include-Datei

am 07.12.2007 17:37:30 von Roland Smiderkal

Dank Thomas Hamachers Anregung (Message-ID:
) hab ich mir ein
"Session-Singleton" gebaut:

session_name('TESTSESSID');
session_start();

class MyClass
{
private function __construct() { }

static public function getInstance()
{
if (! is_object($_SESSION['MyClass_Instance'])) {
echo '

Creating new object!

';
$_SESSION['MyClass_Instance'] = new MyClass;
}
else {
echo '

Reusing existing object!

';
}
return $_SESSION['MyClass_Instance'];
}

public function showmsg($msg) { echo "

$msg

"; }
}
?>


$obj1 = MyClass::getInstance();
$obj1->showmsg("Hello");
?>



Dieser Code funktioniert wie gewünscht. Beim ersten Aufruf kommt die
Ausgabe 'Creating new object!', bei allen folgenden: 'Reusing existing
object!'.

Wenn ich jedoch die Klassendefinition von MyClass in eine externe
Datei verschiebe und diese mit require() oder include() einbinde, wird
*immer* eine neue Instanz erzeugt. ('Creating new object!').

Wo liegt hier mein Denkfehler?

Roland

Re: Session-Singleton funktioniert nicht mit Include-Datei

am 07.12.2007 18:50:23 von Christoph Bersch

Roland Smiderkal wrote:
> Dank Thomas Hamachers Anregung (Message-ID:
> ) hab ich mir ein
> "Session-Singleton" gebaut:
>
[CODE]
> Dieser Code funktioniert wie gewünscht. Beim ersten Aufruf kommt die
> Ausgabe 'Creating new object!', bei allen folgenden: 'Reusing existing
> object!'.
>
> Wenn ich jedoch die Klassendefinition von MyClass in eine externe
> Datei verschiebe und diese mit require() oder include() einbinde, wird
> *immer* eine neue Instanz erzeugt. ('Creating new object!').
>
> Wo liegt hier mein Denkfehler?

Meine Glaskugel sagt mir, dass du die Klassendefinition von 'MyClass'
vor Starten der Session einbinden musst:

require_once "session-singleton.inc.php";
session_start();
?>

Frohes Schaffen,
Christoph

Re: Session-Singleton funktioniert nicht mit Include-Datei

am 07.12.2007 20:09:56 von Roland Smiderkal

Christoph Bersch schrieb:
>Meine Glaskugel sagt mir, dass du die Klassendefinition von 'MyClass'
>vor Starten der Session einbinden musst:
>
> >require_once "session-singleton.inc.php";
>session_start();
>?>

Deine Glaskugel hat recht! Trotzdem ist mir nicht klar, warum dann das
folgende funktioniert:

session_start();
class SessionSingleton { /* [...] */ };
?>

Roland

Re: Session-Singleton funktioniert nicht mit Include-Datei

am 07.12.2007 20:45:53 von Michael Fesser

..oO(Roland Smiderkal)

>Christoph Bersch schrieb:
>>Meine Glaskugel sagt mir, dass du die Klassendefinition von 'MyClass'
>>vor Starten der Session einbinden musst:
>>
>> >>require_once "session-singleton.inc.php";
>>session_start();
>>?>
>
>Deine Glaskugel hat recht! Trotzdem ist mir nicht klar, warum dann das
>folgende funktioniert:
>
> > session_start();
> class SessionSingleton { /* [...] */ };
> ?>

Der Code wird geladen, compiliert, ausgeführt. Steht die Klassen-
definition in derselben Datei, dann funktioniert das natürlich.

Wird die Klasse aber per 'require' aus einer externen Datei eingebunden,
kann es das beobachtete Problem geben, da 'require' erst zur Laufzeit
ausgeführt wird.

Micha

Re: Session-Singleton funktioniert nicht mit Include-Datei

am 07.12.2007 22:37:49 von Roland Smiderkal

Michael Fesser schrieb:

>Wird die Klasse aber per 'require' aus einer externen Datei eingebunden,
>kann es das beobachtete Problem geben, da 'require' erst zur Laufzeit
>ausgeführt wird.

Die Frage, ob man in PHP eine Datei zur Kompilierungszeit (wie mit
'use' in Perl) einbinden kann, kann ich mir dann wohl sparen.

Danke für alle Antworten
Roland