Beste phphulpers,
Ik heb het volgende stukje code geschreven:
<?php
include('common.php');
include('classes/usersystem.php');

//de init fase
if (!isset($_SESSION['usersystem']))
$_SESSION['usersystem']=new usersystem();

//zijn we ingelogd?
if ($_SESSION['usersystem']->is_loggedin()==false)
echo'loginform';
else
echo'het systeem';
?>

<?php
class usersystem
{
private $username=false;

//returned true of false of de gebruiker wel/niet is ingelogd
function is_loggedin()
{
if ($this->username==false)
return false;
else
return true;
}
}
?>

Maar nu krijg ik deze error:
The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "usersystem" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in....

Nu heb ik het volgende geprobeerd toe te voegen:
<?php
function __autoload($class_name)
{
require_once 'classes/'.$class_name . '.php';
}?>
Maar dit mocht niet baten.

Wat doe ik fout?
Je wilt een object wegschrijven in session, wat een serialize call is. Immers je kan geen object in session bewaren, dat wordt daarom geserialiseerd, en gedeserialiseerd. MAW je usersysteem in een variabele stoppen. En niet met session werken voor je object.
Eerst je class-definitie includen, dan pas [php]session_start[/php] aanroepen. Bij session_start wordt intern [php]unserialize[/php] aangeroepen, en wordt de in de sessie opgeslagen string omgezet naar een array van normale PHP waarden, en die array is dat wat jij benadert via $_SESSION. En als PHP niet weet hoe je class eruit ziet, kan hij niet die string, die eigenlijk alleen de waarden die je in je class had bevat, terug omzetten naar iets dat een volledig werkende instantie van je class is.

Alternatief kan je autoload gebruiken, maar dan moet je wel je eigen autoload functie hebben gedefinieerd (of gemarkeerd via [php]spl_autoload_register[/php]) alvorens je session_start aanroept.

En als PHP session autostart heeft aanstaan in je PHP.ini, dan zal je dat uit moeten zetten, of overriden via je .htaccess bestandje.
Helaas krijg ik de oplossing van Jelmer niet aan de praat. De oplossing van Ed vind ik meer een workaround...

Desalniettemin bedenkt voor de reacties, hier leer ik weer van :)

De volgende oplossing heb ik wel gevonden voor mijn probleem (en gebruik ik nu):

<?php
//de init fase
if (!isset($_SESSION['usersystem']))
$_SESSION['usersystem']=serialize(new usersystem());

$usersystem=unserialize($_SESSION['usersystem']);

//zijn we ingelogd?
if ($usersystem->is_loggedin()==false)
echo'loginform';
else
echo'het systeem';

//sla weer op in de sessie
$_SESSION['usersystem']=serialize($usersystem);
?>
Ik vraag me af wat je probeert te doen?
is het niet makkelijker om gewoon dit te doen:
<?php
require('bestand waarin je class gedefinieerd wordt');
session_start();
?>
Je moet er simpelweg voor zorgen dat de class (waarvan $_SESSION['usersystem'] een instantie is) gedeclareerd is voor je sessievariabele wordt aangeroepen.

Reageren