/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste