In een applicatie heb ik 4 classes:
- Registry
- Db
- User
- Form

Er zijn 2 belangrijke criteria:
- Het Form moet (bepaalde) class vars in User kunnen veranderen.
- De User moet ik in alle scripts kunnen aanroepen, compleet met de gewijzigde variabelen intact, zoals deze in Form zijn aangebracht, zodat ik daaruit data kan lezen.

In Registry berg ik Db en User op als singleton (ook nog maar net geleerd :)).
De class Form wordt bij elk form aangeroepen met new Form.
Zowel class User als class Form kunnen Db aanroepen in een class var en in Form zit een class var, die het User-object bevat.

Nu het vreemde.
Ik laat de gebruiker inloggen en redirect hem na succes.
Alleen: als ik dan een instantie van User uit Registry haal, dan zijn alle variabelen van User pleite.
Hier een versimpelde versie (die dus ook niet werkt).

Waar kijk ik nou overheen?

Bedankt alvast voor de hulp.

Roland


Registry:
<?php
setObjects();

// kijken of we objecten hebben; zo niet, dan registreren
function setObjects() {
$registry =& Registry::getInstance();

if (is_object($oUser =& $registry->get('user')) == false) {
include_once 'inc.class.user.php';
$oUser = new User;
$registry->set('user', $oUser);
}
}

function getUser() {
$registry =& Registry::getInstance();
$oUser =& $registry->get('user');
return $oUser;
}

class Registry {

var $_objects = array();

function set($sObjectName, &$oObject) {
$this->_objects[$sObjectName] =& $oObject;
}

function &get($sObjectName) {
return $this->_objects[$sObjectName];
}

function &getInstance() {
static $me;

if (is_object($me) == true) {
return $me;
}

$me = new Registry;
return $me;
}
} // end class
?>

Form:
<?php
class Form {
var $user;
function Form() {}

public function test() {
$this->user->id = 6; // voor de test
$this->user->loginSuccess();
}
} // end class
?>

User:
<?php
class User {
var $id;
var $loggedIn;
function User() {}

function loginSuccess() {
$this->loggedIn = true;
}
} // end class
?>

Login:
<?php
session_start();
ob_start();
include_once 'inc.class.registry.php';
include_once 'inc.class.form.php';
echo '<html><head><title>login</title></head><body>';
$oUser = &getUser();
$oForm = new Form;
$oForm->user = $oUser;
$oForm->test();
header('location: doeiets.php');
echo '</body></html>'; // komen we nooit
?>

doeIets:
<?php
session_start();
ob_start();
include_once 'inc.class.registry.php';
echo '<html><head><title>doeiets</title></head><body>';
$oUser = &getUser();
echo 'DOEIETS.PHP<br />';
echo '===========<br />';
echo 'Is $oUser een object? ' . (is_object($oUser) ? 'JA' : 'NEE') . '<br />';
echo 'Heeft $oUser een id? ' . ($oUser->id ? 'JA' : 'NEE') . '<br />';
echo 'Is $oUser ingelogd? ' . ($oUser->loggedIn ? 'JA' : 'NEE') . '<br />';
echo '</body></html>';
?>
Probeer regel 9 ($oForm->user = $oUser;) te vervangen door
$oForm->user =& $oUser;
Geprobeerd, werkt ook niet. Class vars 'id' en 'loggedIn' blijven leeg, terwijl oUser wél een object is.
<?php
// ik had al staan:
$oUser = &getUser();
// en veranderd in (de & ampersand):
$oUser =& getUser();
?>
In de Registry maakt ie het object maar één keer aan (als het goed is).
Ik geef het netjes mee aan Form, alwaar ik de obj.vars wijzig van datzelfde object (denk ik toch...)
En vervolgens: nada.

Ik snap er helemaal niks van... Toch bedankt!
je doet een header location wijziging... dit is gewoon een refresh en alle objecten zijn er dan vandoor....
je zou je Registry kunnen serializen en opslaan in een sessie... erg aan te raden is dat echter niet
@michel:
Serializen... dat zal ik even moeten bestuderen, nooit gedaan :)
Het is wel een ramp zeg... daar had ik met het ontwerp, niet op gerekend, dat je al je waarden kwijt bent na een doodgewone refresh/header location.

Is er een andere mogelijkheid om de user op een andere pagina te krijgen mét behoud van de vars?
Het is niet zo mooi, maar... misschien javascript:window.location ?
Of zit ik met hetzelfde principe, refresh: alles weg?
Zal het eens uitproberen.
Dus niet in een sessie? Het zijn "maar" 2 objecten.

Dank je voor de info.
Session is the answer!

Voor de redirect wijs je de objecten to aan de sessie, na de redirect haal je ze er gewoon opnieuw uit :)

http://be2.php.net/session
Ik denk dat ik het zo maar eens ga doen, ja.
Bedankt!
Opgelost :)
Inderdaad met session en serialize.

In User:
<?php
function loginSuccess() {
$this->loggedIn = true;
$oSelf = serialize($this);
$_SESSION['user'] = $oSelf;
header('location: doeiets.php');
exit();
}
?>

en in doeIets.php
<?php
$oUser = unserialize($_SESSION['user']);
echo 'DOEIETS.PHP<br />';
echo '===========<br />';
echo 'Is $oUser een object? ' . (is_object($oUser) ? 'JA' : 'NEE') . '<br />';
echo 'Heeft $oUser een id? ' . ($oUser->id ? 'JA' : 'NEE') . '<br />';
echo 'If Ja, wat is dat id dan? ' . $oUser->id . '<br />';
echo 'Is $oUser ingelogd? ' . ($oUser->loggedIn ? 'JA' : 'NEE') . '<br />';
?>

Bedankt voor de tips!

Reageren