|
| Webløsning i objektorienteret php Fra : Preben Holm |
Dato : 01-09-04 18:23 |
|
Hej gruppe,
jeg har lidt en ide om at objektorienteret PHP måske ikke giver den
fleksibilitet almindelig programmering giver.
Det er blot en ide, men lad os nu lege med ideen at vi har et
produktkatalog med nogle produkter lagret i en SQL database (mySQL
f.eks.) som skal præsenteres på hjemmesiden, man skal kunne se detaljer
og bestille produkterne direkte på siden.
Hvordan ville I opbygge ovenstående, hvis I arbejdede objektorienteret
med PHP?
Og hvorfor gøre det objektorienteret fremfor almindelig gammeldags
php-kodning?
Jeg kunne selv se ideen hvis klasserne faktisk blev bevaret i ens
session, men svjv. bliver de ikke lagret, med mindre man eksplicit
definerer en klasse i en session-variabel - tager jeg fejl?
Mvh / Preben Holm
| |
Peter Binderup (01-09-2004)
| Kommentar Fra : Peter Binderup |
Dato : 01-09-04 19:54 |
|
Preben Holm wrote:
>
> Og hvorfor gøre det objektorienteret fremfor almindelig gammeldags
> php-kodning?
>
Fordi at det er nemmere at vedligeholde. Det er min erfaring at det
nemmere at dele programerings opgaver ud til flere hvis man deler det op
i arbejde på klasser.
Du bygger dit system op i moduler og det hele bliver som at lege med lego.
Ved PHP4 kan man groft sagt sige at klasserne blot var grupperinger af
funktioner, hvor man ved php5 nu har flere af de muligheder som f.eks.
java udviklere tager for givet
( https://www.zend.com/php5/andi-book-excerpt.php).
> Jeg kunne selv se ideen hvis klasserne faktisk blev bevaret i ens
> session, men svjv. bliver de ikke lagret, med mindre man eksplicit
> definerer en klasse i en session-variabel - tager jeg fejl?
Du kan bruge kommandoen serialize til at gemme et objekt i session data,
og så bruge unserialize ved den næste side hvor du skal bruge session data.
| |
Michael Rasmussen (02-09-2004)
| Kommentar Fra : Michael Rasmussen |
Dato : 02-09-04 16:04 |
|
On Wed, 01 Sep 2004 20:54:08 +0200, Peter Binderup wrote:
>
> Du kan bruge kommandoen serialize til at gemme et objekt i session data,
> og så bruge unserialize ved den næste side hvor du skal bruge session
> data.
I php5 er dette ikke nødvendigt, da alle aktive objekter vedligeholdes i
hver session. Det nye i php5 er, at alle objekter default
referenceoverføres, så hvis en reference til objektet gemmes i $_SESSION
fortages serialize/unserialize automatisk for dig. Forøvrigt viser test
Zend.com, at php5 nye objektimplementation har øget performance
betydeligt
--
Hilsen/Regards
Michael Rasmussen
Get my public GnuPG keys:
mir <at> datanom <dot> net
http://search.keyserver.net:11371/pks/lookup?op=get&search=0xE501F51C
mir <at> miras <dot> org
http://search.keyserver.net:11371/pks/lookup?op=get&search=0xE3E80917
--------------------------------------------------------------
Condense soup, not books!
| |
Peter Binderup (03-09-2004)
| Kommentar Fra : Peter Binderup |
Dato : 03-09-04 08:07 |
|
Michael Rasmussen wrote:
> I php5 er dette ikke nødvendigt, da alle aktive objekter vedligeholdes i
> hver session. Det nye i php5 er, at alle objekter default
> referenceoverføres, så hvis en reference til objektet gemmes i $_SESSION
> fortages serialize/unserialize automatisk for dig. Forøvrigt viser test
> Zend.com, at php5 nye objektimplementation har øget performance
> betydeligt
Nice - har du et link til en beskrivelse af overførelse af objekter?
/Peter
| |
Jacob Atzen (03-09-2004)
| Kommentar Fra : Jacob Atzen |
Dato : 03-09-04 08:53 |
|
Peter Binderup <binderup@hotmail.com> writes:
> Michael Rasmussen wrote:
>
> > I php5 er dette ikke nødvendigt, da alle aktive objekter vedligeholdes i
> > hver session. Det nye i php5 er, at alle objekter default
> > referenceoverføres, så hvis en reference til objektet gemmes i $_SESSION
> > fortages serialize/unserialize automatisk for dig. Forøvrigt viser test
> > Zend.com, at php5 nye objektimplementation har øget performance
> > betydeligt
>
> Nice - har du et link til en beskrivelse af overførelse af objekter?
Der er ikke så meget i det. Du tildeler bare dit objekt til din
sessions variabel:
$_SESSION['mitObjekt'] = $mitObjekt;
Det eneste du skal være opmærksom på, er at din klasse skal være
defineret før du prøver at læse dit objekt fra din session igen.
--
Med venlig hilsen
- Jacob Atzen
| |
Peter Binderup (03-09-2004)
| Kommentar Fra : Peter Binderup |
Dato : 03-09-04 09:22 |
|
Jacob Atzen wrote:
> Der er ikke så meget i det. Du tildeler bare dit objekt til din
> sessions variabel:
>
> $_SESSION['mitObjekt'] = $mitObjekt;
>
> Det eneste du skal være opmærksom på, er at din klasse skal være
> defineret før du prøver at læse dit objekt fra din session igen.
>
Definer "defineret" mener du at jeg skal have den instantieret (new())
eller bare have klassen med i en include?
/Peter
| |
Jacob Atzen (03-09-2004)
| Kommentar Fra : Jacob Atzen |
Dato : 03-09-04 09:31 |
|
Peter Binderup <binderup@hotmail.com> writes:
> Jacob Atzen wrote:
> > Der er ikke så meget i det. Du tildeler bare dit objekt til din
> > sessions variabel:
> > $_SESSION['mitObjekt'] = $mitObjekt;
> > Det eneste du skal være opmærksom på, er at din klasse skal være
> > defineret før du prøver at læse dit objekt fra din session igen.
> >
>
> Definer "defineret" mener du at jeg skal have den instantieret (new())
> eller bare have klassen med i en include?
Med defineret mener jeg, at du skal have inkluderet den kode, der
indeholder din "class".
Følgende er korrekt:
class Foo {}
$foo = $_SESSION['foo'];
Hvorimod dette ikke er korrekt:
$foo = $_SESSION['foo'];
class Foo {}
Om du "includer" dine klasser eller har dem stående i samme fil er
underordnet. Bemærk i øvrigt, at du formentlig hellere vil bruge
require_once() i de fleste tilfælde.
--
Med venlig hilsen
- Jacob Atzen
| |
Michael Rasmussen (03-09-2004)
| Kommentar Fra : Michael Rasmussen |
Dato : 03-09-04 16:39 |
| | |
Jacob Atzen (01-09-2004)
| Kommentar Fra : Jacob Atzen |
Dato : 01-09-04 22:23 |
|
Preben Holm <64bitNOnoSPAMno@mailme.dk> writes:
> jeg har lidt en ide om at objektorienteret PHP måske ikke giver den
> fleksibilitet almindelig programmering giver.
Hvilken fleksibilitet er det?
> Det er blot en ide, men lad os nu lege med ideen at vi har et
> produktkatalog med nogle produkter lagret i en SQL database (mySQL
> f.eks.) som skal præsenteres på hjemmesiden, man skal kunne se
> detaljer og bestille produkterne direkte på siden.
>
> Hvordan ville I opbygge ovenstående, hvis I arbejdede objektorienteret
> med PHP?
Så ville man nok have en eller flere produkt klasser og noget database
abstraktion som datalag. Man kunne benytte sig af MVC
(model-view-controller) mønsteret til at opdele sin applikation
fornuftigt. Og så kunne man lave 1000 andre ting afhængig af
ambitionsniveau og evne.
> Og hvorfor gøre det objektorienteret fremfor almindelig gammeldags
> php-kodning?
Fordi almindelig gammeldags php-kodning har en tendens til at blive
en gang spaghetti kode. Objekt orienteret programmering giver dig
værktøjer, der gør det lettere for dig at opdele din kode i
velafgrænsede stumper, hvilket igen gør det lettere at overskue,
tilrette, fejlsøge, vedligeholde, etc, etc. Det er i alt fald min
overbevisning, jeg er sikker på du kan finde folk, der endnu ikke har
set lyset
> Jeg kunne selv se ideen hvis klasserne faktisk blev bevaret i ens
> session, men svjv. bliver de ikke lagret, med mindre man eksplicit
> definerer en klasse i en session-variabel - tager jeg fejl?
Mener du her klasser eller objekter? Dine klasser står defineret i
din kode. Dine objekter kan du sagtens lagre i sessions variable
ligesom alt muligt andet.
--
Med venlig hilsen
- Jacob Atzen
| |
Preben Holm (02-09-2004)
| Kommentar Fra : Preben Holm |
Dato : 02-09-04 14:16 |
|
Well, jeg har tænkt lidt over det, men synes måske alligevel lyset er
lidt sværere at se - jeg havde set den klare ide med det samme hvis det
nu var session-baserede objekter man arbejdede med, men dem skal man
selv gemme og det fjerner lidt ideen må jeg indrømme.
Nå, men anyway. Vil nu alligevel nok kigge lidt mere på det. Har I nogle
links til guides til OO-PHP?
Mvh / Preben Holm
| |
Nezar Nielsen (02-09-2004)
| Kommentar Fra : Nezar Nielsen |
Dato : 02-09-04 19:40 |
|
Preben Holm wrote:
> Well, jeg har tænkt lidt over det, men synes måske alligevel lyset er
> lidt sværere at se - jeg havde set den klare ide med det samme hvis det
> nu var session-baserede objekter man arbejdede med, men dem skal man
> selv gemme og det fjerner lidt ideen må jeg indrømme.
Altså normalt arbejder man jo med et databaseabstraktionslag, f.eks. i
en simplificeret ordre, produkt, indkøbskurv situation baseret på sessions:
Når der tilføjes en vare til indkøbskurven:
$_SESSION['kurv'][] = 42; //et eller andet produktnr.
Og når man så skal ha' vist indholdet i kurven:
foreach($_SESSION['kurv'] as $produktid){
$produkt = new Produkt($produktid);
print $produkt->navn.' '.$produkt->pris.'<br>';
}
Og når ordren skal afsendes:
$ordre = new Ordre();
$ordre->modtager('...');
$ordre->save();
foreach($_SESSION['kurv'] as $produktid){
$produkt = new Produkt($produktid);
$ordrelinie = new Ordrelinie();
$ordrelinie->produkt($produkt->id());
$ordrelinie->pris($produkt->pris());
$ordrelinie->save();
}
og så sørger klasserne Produkt, Ordre og Ordrelinie selv for resten...
--
Mvh. Nezar Nielsen
http://fez.dk
| |
Nezar Nielsen (02-09-2004)
| Kommentar Fra : Nezar Nielsen |
Dato : 02-09-04 19:41 |
|
Nezar Nielsen wrote:
....
> $ordrelinie->produkt($produkt->id());
> $ordrelinie->pris($produkt->pris());
og måske også
$ordrelinie->ordre($ordre);
> $ordrelinie->save();
> }
--
Mvh. Nezar Nielsen
http://fez.dk
| |
Preben Holm (02-09-2004)
| Kommentar Fra : Preben Holm |
Dato : 02-09-04 20:40 |
|
> Altså normalt arbejder man jo med et databaseabstraktionslag, f.eks. i
> en simplificeret ordre, produkt, indkøbskurv situation baseret på sessions:
>
> Når der tilføjes en vare til indkøbskurven:
>
> $_SESSION['kurv'][] = 42; //et eller andet produktnr.
>
> Og når man så skal ha' vist indholdet i kurven:
>
> foreach($_SESSION['kurv'] as $produktid){
> $produkt = new Produkt($produktid);
> print $produkt->navn.' '.$produkt->pris.'<br>';
> }
>
> Og når ordren skal afsendes:
>
> $ordre = new Ordre();
> $ordre->modtager('...');
> $ordre->save();
> foreach($_SESSION['kurv'] as $produktid){
> $produkt = new Produkt($produktid);
> $ordrelinie = new Ordrelinie();
> $ordrelinie->produkt($produkt->id());
> $ordrelinie->pris($produkt->pris());
> $ordrelinie->save();
> }
>
> og så sørger klasserne Produkt, Ordre og Ordrelinie selv for resten...
Ja, okay... men hvor lang vil du f.eks. lade det gå! Vil du have en
lagdelt arkitektur eller hvad?
Altså, UI (browseren og lidt kodning til præsentation), kerne-lag og
persistens-lag ses jo normalt som et minima til applikationer i
objektorienterede systemer, men vil du med andre ord slå kerne-lag og
persistens-laget sammen i et lag?
Mvh / Preben Holm
| |
Nezar Nielsen (03-09-2004)
| Kommentar Fra : Nezar Nielsen |
Dato : 03-09-04 11:27 |
|
Preben Holm wrote:
> Ja, okay... men hvor lang vil du f.eks. lade det gå! Vil du have en
> lagdelt arkitektur eller hvad?
Det bestemmer man jo selv, også ud fra størrelsen på applikationen, der
er jo ikke nogen der TVINGER en til at arbejde 100% objektorienteret
bare fordi man bruger nogle OO principper til at lette data-access og
andre ting. Det er jo det gode ved php's OO-features.
--
Mvh. Nezar Nielsen
http://fez.dk
| |
Ukendt (02-09-2004)
| Kommentar Fra : Ukendt |
Dato : 02-09-04 21:42 |
|
Nezar Nielsen wrote:
> Når der tilføjes en vare til indkøbskurven:
>
> $_SESSION['kurv'][] = 42; //et eller andet produktnr.
Ville det ikke være bedre at bruge produktnummeret
som index? Derved kan man gemme antallet af den
pågældende varer, der er i kurven.
Dvs.
//$produktID - produktnr
//$antal - antal varer, der skal tilføjes
if(isset($_SESSION['kurv'][$nr]))
$_SESSION['kurv'][$produkID] += $antal;
else
$_SESSION['kurv'][$produktID] = $antal;
> Og når man så skal ha' vist indholdet i kurven:
>
> foreach($_SESSION['kurv'] as $produktid){
> $produkt = new Produkt($produktid);
> print $produkt->navn.' '.$produkt->pris.'<br>';
> }
Og så skal der rettes tilsvarende her.
foreach($_SESSION['kurv'] as $produktID => $antal)
{
$produkt = new Produkt($produktID);
print($produkt->navn.' '.$produkt->antal.' stk á '.
$produkt->pris.' '.($produkt->antal*$produkt->pris).
'<br>');
}
--
Mvh.
Martin Møller Bæk
www.yavi.dk
| |
Peter Brodersen (03-09-2004)
| Kommentar Fra : Peter Brodersen |
Dato : 03-09-04 00:12 |
|
On Thu, 02 Sep 2004 22:42:28 +0200, Martin Møller Bæk
<martin@sletdetteherfoerstaflame.dk> wrote:
>if(isset($_SESSION['kurv'][$nr]))
> $_SESSION['kurv'][$produkID] += $antal;
>else
> $_SESSION['kurv'][$produktID] = $antal;
isset() fungerer tåbeligt/defekt på arrays. Hvis $_SESSION['kurv'] er
sat, så vil isset($_SESSION['kurv']['whatnot']) altid give sandt :(
Fx:
<?php
$a = array("foo" => "bar");
var_dump(isset($a['foo']['baz']));
?>
Løsningen er array_key_exists():
http://www.php.net/array-key-exists
(ikke at det gør så meget i dit eksempel - udover at der står produkID
og ikke produktID i anden linje - for uden notices går det at tilføje
til en ikke-oprettet key)
--
- Peter Brodersen
Memento mori!
| |
Ukendt (03-09-2004)
| Kommentar Fra : Ukendt |
Dato : 03-09-04 23:55 |
|
Peter Brodersen wrote:
> On Thu, 02 Sep 2004 22:42:28 +0200, Martin Møller Bæk
> <martin@sletdetteherfoerstaflame.dk> wrote:
>>if(isset($_SESSION['kurv'][$nr]))
>> $_SESSION['kurv'][$produkID] += $antal;
>>else
>> $_SESSION['kurv'][$produktID] = $antal;
>
> isset() fungerer tåbeligt/defekt på arrays. Hvis $_SESSION['kurv'] er
> sat, så vil isset($_SESSION['kurv']['whatnot']) altid give sandt :(
> Fx:
>
> <?php
> $a = array("foo" => "bar");
> var_dump(isset($a['foo']['baz']));
> ?>
Hmm. Jeg prøvede lige følgende
$ar = array();
$ar['kurv'] = array(1 => 3);
var_dump(isset($ar['kurv'][1]));
var_dump(isset($ar['kurv'][2]));
$a = array("foo" => "bar");
var_dump(isset($a['foo']['baz']));
Resultatet er
bool(true) bool(false) bool(true)
Forskellen er, at de i to første var_dump's er $ar['kurv']
defineret som et array, mens det ikke er tilfældet ved det
tredje var_dump.
Min umiddelbare konklusion er, at hvis man erklærer et index
(f.eks. $ar['kurv']) til at være et array, så kan man godt
bruge isset på et "subindex" (f.eks. $ar['kurv'][1]). Tager
jeg fejl?
> Løsningen er array_key_exists():
> http://www.php.net/array-key-exists
Jeg prøvede også at skrive
var_dump(array_key_exists('baz', $a['foo'])); //Linje 11
Resultatet var
Warning: Wrong datatype for second argument in call to array_key_exists
in e:\internet\projekter\testisset.php on line 11
bool(false)
> (ikke at det gør så meget i dit eksempel - udover at der står produkID
> og ikke produktID i anden linje - for uden notices går det at tilføje
> til en ikke-oprettet key)
Ja, en stavefejl
--
Mvh.
Martin Møller Bæk
www.yavi.dk
| |
Nezar Nielsen (03-09-2004)
| Kommentar Fra : Nezar Nielsen |
Dato : 03-09-04 11:19 |
|
Martin Møller Bæk wrote:
>
> Ville det ikke være bedre at bruge produktnummeret
> som index? Derved kan man gemme antallet af den
> pågældende varer, der er i kurven.
Selvfølgelig, der er så mange ting der kunne gøres andre måder, men nu
skrev jeg jo:
> ... i en simplificeret ordre, ...
^^^^^^^^^^^^^ :)
--
Mvh. Nezar Nielsen
http://fez.dk
| |
|
|