Session-Singleton funktioniert nicht mit Include-Datei

Dank Thomas Hamachers Anregung (Message-ID:
<fiud0r$ed8$1 [at] newsreader2.netcologne.de>) hab ich mir ein
"Session-Singleton" gebaut:

<?php
session_name('TESTSESSID');
session_start();

class MyClass
{
private function __construct() { }

static public function getInstance()
{
if (! is_object($_SESSION['MyClass_Instance'])) {
echo '<p>Creating new object!</p>';
$_SESSION['MyClass_Instance'] = new MyClass;
}
else {
echo '<p>Reusing existing object!</p>';
}
return $_SESSION['MyClass_Instance'];
}

public function showmsg($msg) { echo "<p>$msg</p>"; }
}
?>
<html>
<body>
<?php
$obj1 = MyClass::getInstance();
$obj1->showmsg("Hello");
?>
</body>
</html>

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
Roland Smiderkal [ Fr, 07 Dezember 2007 17:37 ] [ ID #1888195 ]

Re: Session-Singleton funktioniert nicht mit Include-Datei

Roland Smiderkal wrote:
> Dank Thomas Hamachers Anregung (Message-ID:
> <fiud0r$ed8$1 [at] newsreader2.netcologne.de>) 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:

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

Frohes Schaffen,
Christoph
Christoph Bersch [ Fr, 07 Dezember 2007 18:50 ] [ ID #1888206 ]

Re: Session-Singleton funktioniert nicht mit Include-Datei

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

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

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

Roland
Roland Smiderkal [ Fr, 07 Dezember 2007 20:09 ] [ ID #1888209 ]

Re: Session-Singleton funktioniert nicht mit Include-Datei

..oO(Roland Smiderkal)

>Christoph Bersch schrieb:
>>Meine Glaskugel sagt mir, dass du die Klassendefinition von 'MyClass'
>>vor Starten der Session einbinden musst:
>>
>><?php
>>require_once "session-singleton.inc.php";
>>session_start();
>>?>
>
>Deine Glaskugel hat recht! Trotzdem ist mir nicht klar, warum dann das
>folgende funktioniert:
>
> <?php
> 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
Michael Fesser [ Fr, 07 Dezember 2007 20:45 ] [ ID #1888212 ]

Re: Session-Singleton funktioniert nicht mit Include-Datei

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
Roland Smiderkal [ Fr, 07 Dezember 2007 22:37 ] [ ID #1888220 ]
PHP » de.comp.lang.php.misc » Session-Singleton funktioniert nicht mit Include-Datei

Vorheriges Thema: Aktuelle IP wie ermitteln
Nächstes Thema: max. Anzahl in htaccess?