|
| Problemer med session og klasser Fra : Preben |
Dato : 08-08-06 21:43 |
|
Hej
Jeg har lavet en klasse der hedder Colour, og en klasse der hedder
ColourControl som vedhæftet. Det mærkelige er at $_SESSION['colours']
forsvinder efter første load (session initiering - men hvorfor)
---- class.colourcontrol.php ----
<?php
include_once('./products/class.colour.php');
class ColourControl {
var $colours;
function ColourControl() {
if (!isset($_SESSION['colours'])) {
//$adapter = new ColourAdapter;
//$_SESSION['colours'] =
$adapter->getColoursByLang($_SESSION['lang']);
$colour = new Colour();
$colour->code = '001';
$colour->name = 'Sort';
$colours[0] = $colour;
$colour = new Colour();
$colour->code = '040';
$colour->name = 'M.Brun';
$colours[1] = $colour;
$_SESSION['colours'] = $colours;
}
$this->colours = $_SESSION['colours'];
}
function updateColoursFromSession() {
$this->colours = $_SESSION['colours'];
}
function ColourListToNames($list) {
for ($i = 0; $i < count($list); ++$i) {
$res[$i] =& $this->ColourToName($list[$i]);
}
return $res;
}
function ColourToName($code) {
for ($i = 0; $i < count($this->colours); ++$i) {
$c = $this->colours[$i];
if ($code == $c->code) {
return $c->name;
}
}
}
}
?>
-----------------
---- class.colour.php ----
<?php
class Colour {
var $id;
var $code;
var $name;
function Colour() {
}
}
?>
-----------------
og her er test-koden... prøv at loade siden to gange:
---- test.php ----
<?php
session_start();
include_once("./products/class.colourcontrol.php");
$control = new ColourControl;
print $_SESSION['colours'][0]->code;
print "\n\r";
print $_SESSION['colours'][1]->code;
print "<br /><br /><br /><br />";
?>
output første gang giver mening, men intet output anden gang...
En virkelig stor tak til den der finder min fejl... puha - har godt nok
stirret mig blind på dette kode her efterhånden... Kan slet ikke finde
fejlen.
Mvh / Preben Holm
| |
Michael Rasmussen (08-08-2006)
| Kommentar Fra : Michael Rasmussen |
Dato : 08-08-06 21:49 |
|
On Tue, 08 Aug 2006 22:42:57 +0200, Preben wrote:
> Jeg har lavet en klasse der hedder Colour, og en klasse der hedder
> ColourControl som vedhæftet. Det mærkelige er at $_SESSION['colours']
> forsvinder efter første load (session initiering - men hvorfor)
>
Prøv om nedenstående ikke hjælper
> ---- class.colourcontrol.php ----
> <?php
session_start();
> include_once('./products/class.colour.php');
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
| |
Preben (08-08-2006)
| Kommentar Fra : Preben |
Dato : 08-08-06 22:14 |
|
Michael Rasmussen wrote:
> On Tue, 08 Aug 2006 22:42:57 +0200, Preben wrote:
>
>> Jeg har lavet en klasse der hedder Colour, og en klasse der hedder
>> ColourControl som vedhæftet. Det mærkelige er at $_SESSION['colours']
>> forsvinder efter første load (session initiering - men hvorfor)
>>
> Prøv om nedenstående ikke hjælper
>
>> ---- class.colourcontrol.php ----
>> <?php
> session_start();
>> include_once('./products/class.colour.php');
>
Det undrer mig lidt hvorfor du foreslår dette - session er jo blevet
startet i test-filen!
Men det hjælper iøvrigt heller ikke - desværre!
| |
Michael Rasmussen (09-08-2006)
| Kommentar Fra : Michael Rasmussen |
Dato : 09-08-06 00:24 |
|
On Tue, 08 Aug 2006 23:13:37 +0200, Preben wrote:
>
> Det undrer mig lidt hvorfor du foreslår dette - session er jo blevet
> startet i test-filen!
Jeg overså du benytter include i stedet for require.
> Men det hjælper iøvrigt heller ikke - desværre!
Jeg mener fejlen er et helt andet sted.
var $colours;
tildeling: colours[n]. Giver udefineret opførsel i PHP5.
Prøv i stedet for:
var $colours = array();
tildeling: colours[n]
Personligt synes jeg, det bør gøres sådan:
tildeling: array_push($colours, $colour)
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
| |
Martin (09-08-2006)
| Kommentar Fra : Martin |
Dato : 09-08-06 08:54 |
|
Michael Rasmussen wrote:
>
> var $colours;
>
> tildeling: colours[n]. Giver udefineret opførsel i PHP5.
Gør den altid, hvis man ikk tildeler den en type. Altså private, public osv.
| |
Preben (09-08-2006)
| Kommentar Fra : Preben |
Dato : 09-08-06 09:20 |
|
Michael Rasmussen wrote:
> On Tue, 08 Aug 2006 23:13:37 +0200, Preben wrote:
>
>> Det undrer mig lidt hvorfor du foreslår dette - session er jo blevet
>> startet i test-filen!
> Jeg overså du benytter include i stedet for require.
>
>> Men det hjælper iøvrigt heller ikke - desværre!
> Jeg mener fejlen er et helt andet sted.
>
> var $colours;
>
> tildeling: colours[n]. Giver udefineret opførsel i PHP5.
>
> Prøv i stedet for:
>
> var $colours = array();
>
> tildeling: colours[n]
>
> Personligt synes jeg, det bør gøres sådan:
>
> tildeling: array_push($colours, $colour)
Det ser da også langt pænere ud i dit forslag, men kopierede bare fra et
eksempel i php-manualen (syntes selv det er lidt mærkelig at have et
udefineret array)
Mvh / Preben
| |
Bertel Lund Hansen (09-08-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 09-08-06 09:34 |
|
Preben skrev:
> eksempel i php-manualen (syntes selv det er lidt mærkelig at have et
> udefineret array)
Hvorfor er det mærkeligere end en udefineret simpel variabel?
--
Bertel
Der er vant til sprog hvor variabler skal erklæres før de kan
bruges.
| |
Martin (09-08-2006)
| Kommentar Fra : Martin |
Dato : 09-08-06 09:01 |
|
Preben wrote:
> print $_SESSION['colours'][0]->code;
> print "\n\r";
> print $_SESSION['colours'][1]->code;
> print "<br /><br /><br /><br />";
Istedet for at echo'e din session ud, så brug var_dump() så kunne det
være du havde fundet ud af hvorfor det ikke virker.
Efter et par gange på F5 så får jeg følgende output
array(1) { ["colours"]=> array(2) { [0]=>
object(__PHP_Incomplete_Class)#1 (4) { ["__PHP_Incomplete_Class_Name"]=>
string(6) "Colour" ["id"]=> NULL ["code"]=> string(3) "001"
["name"]=> string(4) "Sort" } [1]=> object(__PHP_Incomplete_Class)#2
(4) { ["__PHP_Incomplete_Class_Name"]=> string(6) "Colour" ["id"]=>
NULL ["code"]=> string(3) "040" ["name"]=> string(6) "M.Brun" } } }
Som du nok kan se så er code og name stadig sat, dog er der en masse
andet som er kommet ind.
| |
Martin (09-08-2006)
| Kommentar Fra : Martin |
Dato : 09-08-06 09:07 |
|
Preben wrote:
> $colour = new Colour();
> $colour->code = '001';
> $colour->name = 'Sort';
> $colours[0] = $colour;
Det der vil blive sat ind i $colours[0] er et objekt. Mon ikke du skulle
lave noget output af $colour, så man du får et normalt array, istedet
for et objekt.
i klassen colour kunne du putte følgende funktion på.
function getOut() {
return array("code"=>$this->code,"name"=>$this->name);
}
også smide $colours[0] = $colour->getOut();
så ville dit array i din colours se langt pænere ud, istedet for en
"halvfærdigt" objekt.
| |
Preben (09-08-2006)
| Kommentar Fra : Preben |
Dato : 09-08-06 09:18 |
|
> i klassen colour kunne du putte følgende funktion på.
>
> function getOut() {
> return array("code"=>$this->code,"name"=>$this->name);
> }
>
> også smide $colours[0] = $colour->getOut();
>
> så ville dit array i din colours se langt pænere ud, istedet for en
> "halvfærdigt" objekt.
Forklar lige hvad du mener med et halvfærdigt objekt - har ikke
programmeret objektorienteret PHP særlig længe (2 uger). Og det er
efterhånden da nogle år siden jeg har rørt PHP...
Mvh / Preben
| |
Martin (09-08-2006)
| Kommentar Fra : Martin |
Dato : 09-08-06 10:42 |
|
Preben wrote:
> Forklar lige hvad du mener med et halvfærdigt objekt - har ikke
> programmeret objektorienteret PHP særlig længe (2 uger). Og det er
> efterhånden da nogle år siden jeg har rørt PHP...
Det bedste er nu ikke at have nogle objekter flyvende imellem siderne
(sessionerne) heller have noget array eller lign.
| |
Preben (09-08-2006)
| Kommentar Fra : Preben |
Dato : 09-08-06 09:31 |
|
Okay alle,
nu har jeg rettet lidt hist og her (dog stadig med objekter i
$_SESSION['colours'])
-------- test.php --------
<?php
session_start();
include_once("./products/class.colourcontrol.php");
$control = new ColourControl;
var_dump($_SESSION['colours']);
?>
--------------------------
-------- class.colourcontrol.php --------
<?php
include_once('./products/class.colour.php');
class ColourControl {
var $colours = array();
function ColourControl() {
if (!isset($_SESSION['colours'])) {
//$adapter = new ColourAdapter;
//$_SESSION['colours'] =
$adapter->getColoursByLang($_SESSION['lang']);
$colours = array();
$colour = new Colour();
$colour->code = '001';
$colour->name = 'Sort';
array_push($colours, $colour);
$colour = new Colour();
$colour->code = '040';
$colour->name = 'M.Brun';
array_push($colours, $colour);
$_SESSION['colours'] = $colours;
}
$this->colours =& $_SESSION['colours'];
}
function updateColoursFromSession() {
$this->colours = $_SESSION['colours'];
}
function ColourListToNames($list) {
for ($i = 0; $i < count($list); ++$i) {
$res[$i] =& $this->ColourToName($list[$i]);
}
return $res;
}
function ColourToName($code) {
for ($i = 0; $i < count($this->colours); ++$i) {
$c = $this->colours[$i];
if ($code == $c->code) {
return $c->name;
}
}
}
}
?>
-------------------------
klassen colour er ikke ændret.
Mit nye output bliver så:
-------------------
array(2) { [0]=> object(__PHP_Incomplete_Class)#2 (4) {
["__PHP_Incomplete_Class_Name"]=> string(6) "Colour" ["id"]=> NULL
["code"]=> string(3) "001" ["name"]=> string(4) "Sort" } [1]=>
object(__PHP_Incomplete_Class)#3 (4) { ["__PHP_Incomplete_Class_Name"]=>
string(6) "Colour" ["id"]=> NULL ["code"]=> string(3) "040"
["name"]=> string(6) "M.Brun" } }
-------------------
Hvad er der mere galt? Resultatet er stadig det samme som før.
Mvh / Preben Holm
| |
Martin (09-08-2006)
| Kommentar Fra : Martin |
Dato : 09-08-06 10:46 |
|
Preben wrote:
> Okay alle,
>
> nu har jeg rettet lidt hist og her (dog stadig med objekter i
> $_SESSION['colours'])
Hvorfor?
Kunne du ikke fortælle hvad du egentlig vil have af output i din session
- det ville gøre det meget nemmere er jeg sikker på.
| |
Preben (09-08-2006)
| Kommentar Fra : Preben |
Dato : 09-08-06 11:18 |
|
Martin wrote:
> Preben wrote:
>> Okay alle,
>>
>> nu har jeg rettet lidt hist og her (dog stadig med objekter i
>> $_SESSION['colours'])
>
> Hvorfor?
>
Fordi jeg mener at applikationen ikke bør bygge på arrays i sessions.
Det skyldes delvist at jeg senere ved at jeg vil få brug for at have et
objekt eller flere i min session. Derfor vil jeg gerne have det her til
at virke.
Mener personligt ikke at session-variable bør forekomme for langt nede i
systemet og hvis det er tilfældet så i ret små afgrænsede områder.
> Kunne du ikke fortælle hvad du egentlig vil have af output i din session
> - det ville gøre det meget nemmere er jeg sikker på.
Her kunne jeg godt bruge din array-løsning, men den generaliserer ikke
så godt ind i min applikationsstruktur.
Mener bestemt engang jeg så et eksempel med en indkøbskurv som optrådte
som klasse i en session og indeholdt flere produkter (som klasser).
Mvh / Preben Holm
| |
Preben (09-08-2006)
| Kommentar Fra : Preben |
Dato : 09-08-06 14:28 |
|
Problemet er løst og det er gåden også...
PHP kræver (naturligvis) at klasse-definitionen er loaded i hukommelsen
inden session initieres.
Derfor opstod klassen som værende udefineret, hvilket jo med denne
forklaring egentlig er forståelig nok.
Måske det var smartere hvis PHP gemte klassedefinitionen for alle
objekter der lagres i session-variablen, men dermed også noget
vanskeligere at håndtere.
Så til andre, hvis I gemmer objekter i $_SESSION, så husk altid at
klassedefinitionen skal være loaded før session_start().
Det betyder samtidig også at session auto start ikke må være aktiveret i
konfigurationsfilen.
Mange tak for alles hjælp - det har godt nok været en irriterende fejl
og har kostet mange timer for mig.
Med venlig hilsen
Preben Holm
| |
|
|