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

On Fri, 03 Sep 2004 09:07:23 +0200, Peter Binderup wrote:

>
> Nice - har du et link til en beskrivelse af overførelse af objekter?
>
Du kan læse om php 5's nye objektmodel i denne glimrende artikel fra
zend.com: http://www.php.net/zend-engine-2.php

--
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
--------------------------------------------------------------
Don't comment bad code - rewrite it.
- The Elements of Programming Style (Kernighan & Plaugher)



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

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

Månedens bedste
Årets bedste
Sidste års bedste