|  | 		    
					
        
         
          
         
	
          | |  | 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
 
 
 |  |  | 
 |  |