Avatar billede bizcom Novice
04. juni 2006 - 18:45 Der er 10 kommentarer og
1 løsning

Objectorienteret PHP

Hej

Jeg har lige et par spørgsål vedr. objectorienteret php, som jeg er begyndt at kigge lidt på!

Hvis man f.eks. har et profil objekt, der indeholder en masse andre objekter med data fra databasen!

Hvordan gemmer man den i en container, så man ikke skal oprette dem og i db hver gang brugeren skifter side..

I java ville jeg have en objekt holder imellem db og gui... kan man det i PHP og hvis ja,,, hvordan tilgår man den så fra samtlige sider!

Hvis intet af dette er muligt,, hvordan er så det mest rigige at gøre!
Avatar billede gizmo-gizmo Nybegynder
04. juni 2006 - 18:58 #1
Jeg ved ikke om jeg forstået det rigtigt, men kan du ikke bare gemme dit profilobjekt i en sessions variabel. Altså noget i retning af:

$_SESSION['minprofil'] = $mitprofilobjekt;

Så vil du jo kunne tilgå dit objekt på samtlige sider.
Avatar billede bizcom Novice
04. juni 2006 - 19:00 #2
Jo tak, hvis man kan gemme objekter i en sessions variable...

Hvor nice :)

Svar lige så du kan få points!
Avatar billede michael_stim Ekspert
04. juni 2006 - 19:07 #3
All registered variables are serialized after the request finishes. Registered variables which are undefined are marked as being not defined. On subsequent accesses, these are not defined by the session module unless the user defines them later.

Warning

Some types of data can not be serialized thus stored in sessions. It includes resource variables or objects with circular references (i.e. objects which passes a reference to itself to another object).
Avatar billede gizmo-gizmo Nybegynder
04. juni 2006 - 19:19 #4
(svar), Men der er åbenbart nogle problemer forbundet med det som Michael skriver.
Avatar billede bizcom Novice
04. juni 2006 - 19:26 #5
Det virker ikke i mit tilfælde!!!

Jeg har et profil object, der indeholder forskellige andre objekter (alle rækker fra db)

Hvis jeg gemmer dette objekt i en session variable, så og forsøger at hente det på side2, så er det tomt!!!

// SIDE1
$profil = new Profile(1);
$_SESSION['PROFILE'] = $profil;

// SIDE2
<?php
// page2.php
session_start();
$pr2 = $_SESSION['PROFILE'];
$pr2->displayShop();
?>
<html>
</html>
Avatar billede gizmo-gizmo Nybegynder
04. juni 2006 - 19:30 #6
Har du husket at køre en session_start() på side 1? altså før du sætter sessionsvariablen.
Avatar billede bizcom Novice
04. juni 2006 - 19:30 #7
Sorrry.. det virkede alligevel... (havde ikke inkluderet klasserne på sitet)!

Jeg forstår ikke helt michaels kommentar!!

Hvad menes der med de sidste 2 linier...

What is the meaning of the 2 last lines... and would it be possible to get an example?
Avatar billede gizmo-gizmo Nybegynder
04. juni 2006 - 19:34 #8
bizcom: det er copy'n'paste fra manualen, så mon ikke han taler dansk? ;-)  Når data bliver gemt i sessions så bliver de serialized, og det kan den ikke finde ud af med alle typer data (som jeg har forstået), f.eks. med "resources", men det er dit objektivt jo umiddelbart ikke. Og så med "circular references" - der må jeg melde pas.
Avatar billede michael_stim Ekspert
04. juni 2006 - 19:35 #9
Jeg er skam dansk ;o)
Det er noget jeg har copy/pastet fra www.php.net, derfor det udenlandske sprog ;o)
Som jeg tolker det er det når man refererer först til sig selv og derefter til et andet objekt.
Avatar billede bizcom Novice
04. juni 2006 - 19:37 #10
Ok... Hmm... ja.. får vel en fejl hvis det går galt!
Avatar billede fangel Nybegynder
06. juni 2006 - 10:03 #11
As said: hvis dit objekt indeholder variabler af typen "resource" (fx en file-pointer, database-connection etc), så vil denne blive mistet ved at gemme den i en session-variablen.. Men man kan dog komme udenom det vha diverse "magic" funktioner

Ref: http://dk2.php.net/manual/en/language.oop5.magic.php

Nærmere bestemt: __sleep (bliver kaldt ved serialize) og __wakeup (bliver kaldt ved unserialize)

Altså:
<?php
class MyObj {
  private $fp;
  public function __construct() {
    $this->fp = fopen('/min/fil.txt', 'w+');
  }

  public function __sleep() {
    fclose($fp);
  }
  public function __wakeup() {
    $this->fp = fopen('/min/fil.txt', 'w+');
  }
}
?>

-fangel
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester