/ 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
OOP constructors tilbagemeldinger
Fra : Dann Pedersen


Dato : 26-08-02 14:51

Hejsa,

Jeg har to spørgsmål, der hænger tæt sammen. Når jeg laver et nyt objekt
vha. new kommandoen, har jeg så nogen mulighed for at fange en eventuel
værdi som constructoren returnere i klassen samtidig med at den laver
objektet?

Derudover vil jeg meget gerne vide om der er andre muligheder end die for at
stoppe et objekt i at blive lavet i en constructor.

På forhånd tak for hjælpen.

/dape



 
 
Martin Mouritzen (26-08-2002)
Kommentar
Fra : Martin Mouritzen


Dato : 26-08-02 23:51

After I finished the 3 Pan Galactic Gargle Blasters, "Dann Pedersen"
<dann_pedersen@canwetalk.com> just offered me, he muttered some weird
stuff, and I had to correct this gibberish:

>Jeg har to spørgsmål, der hænger tæt sammen. Når jeg laver et nyt objekt
>vha. new kommandoen, har jeg så nogen mulighed for at fange en eventuel
>værdi som constructoren returnere i klassen samtidig med at den laver
>objektet?

Umiddelbart tror jeg det ikke. Og sådan skal det heller ikke være. -
En constructor skal ikke returnere en værdi, men oprette en instans af
objektet.

Du kan selvfølgelig sætte nogle værdier, som du derefter kan hente ud,
f.eks.:

class Foo {
var $bar;
function Foo() {
$bar = "hejsa";
}
}
$foo = new Foo();
$text = $foo->bar;

>Derudover vil jeg meget gerne vide om der er andre muligheder end die for at
>stoppe et objekt i at blive lavet i en constructor.

Det ved jeg så ikke lige på stående fod. - Har du kigget i manualen?
--
Nano Martin Mouritzen Phone +45 27105580
Vesterbrogade 30C. 2. Programmer Advanced Simplicity
DK-8000 Århus martin@nano.dk http://www.nano.dk
Nano nu officiel dansk distributør af UltraEdit, se mere på websitet

Per Thomsen (27-08-2002)
Kommentar
Fra : Per Thomsen


Dato : 27-08-02 00:46

Martin Mouritzen wrote:
> After I finished the 3 Pan Galactic Gargle Blasters, "Dann Pedersen"
> <dann_pedersen@canwetalk.com> just offered me, he muttered some weird
> stuff, and I had to correct this gibberish:
>
>
>>Jeg har to spørgsmål, der hænger tæt sammen. Når jeg laver et nyt objekt
>>vha. new kommandoen, har jeg så nogen mulighed for at fange en eventuel
>>værdi som constructoren returnere i klassen samtidig med at den laver
>>objektet?
>
>
> Umiddelbart tror jeg det ikke. Og sådan skal det heller ikke være. -
> En constructor skal ikke returnere en værdi, men oprette en instans af
> objektet.
>
> Du kan selvfølgelig sætte nogle værdier, som du derefter kan hente ud,
> f.eks.:
>
> class Foo {
> var $bar;
> function Foo() {
> $bar = "hejsa";

Øh.. mon ikke det skulle have været:
   $this->bar = "hejsa";

Jeg tror ikke det første virker, men jeg
er ikke sikker.


> }
> }
> $foo = new Foo();
> $text = $foo->bar;
>
>
>>Derudover vil jeg meget gerne vide om der er andre muligheder end die for at
>>stoppe et objekt i at blive lavet i en constructor.

Hvis du spørger om der findes andre måder at undlade at konstruere et
objekt på, efter constructoren er kaldt, end det at terminere scriptet
midt i constructoren, tror jeg at svaret er "Nej, der findes ikke andre
måder - og hvorfor skulle man dog nogensinde ønske at gøre det?".

Men hvis du spørger om der findes andre måder at undlade et konstruere
et objekt på, efter constructoren er kaldt, end lige præcis det at
kaldes funktionen "die", så¨"Ja, du kan kalde "trigger_error" med en
passende error level". Men i praksis gør trigger_error vist bare det at
den kalder en underliggende "die" funktionen (self. hvis den i
parametren angivne error level kræver det).

Men igen ville jeg nok spørge - hvorfor i al verden skulle man dog gøre det?

Jeg ville nok foretrække at være sikker på at et objekt skal konstrueres
før jeg kalder constructoren.

MVH Per Thomsen,
http://www.pert.dk/


Dann Pedersen (27-08-2002)
Kommentar
Fra : Dann Pedersen


Dato : 27-08-02 09:51

"Per Thomsen" <pert@pert.dk> wrote in message
news:3D6ABDC6.2070204@pert.dk...
>
> Øh.. mon ikke det skulle have været:
> $this->bar = "hejsa";
>
> Jeg tror ikke det første virker, men jeg
> er ikke sikker.

Det skulle det - ellers vil du lave en ny variabel med lokalt scope til den
enkelte funktion - når den så var færdig med at blive kørt ville indholdet
være tabt.

> Men igen ville jeg nok spørge - hvorfor i al verden skulle man dog gøre
det?
>
> Jeg ville nok foretrække at være sikker på at et objekt skal konstrueres
> før jeg kalder constructoren.

Helt klart også min holdning. Problemet er konkret at et objekt bliver
genereret på baggrund af noget indhold i en database. Dem der kalder
objektet opretter det så det repræsentere en post i en database. Hvis nu
posten ikke eksistere, så er det problematisk at der er et objekt, der ikke
har noget indhold. Og da det ikke er mig, der står for at oprette objekterne
i koden, vil jeg gerne være sikker på at der er en tilhørende post i
databasen. Det kunne være smart hvis man i constructoren kunne gøre kalderen
opmærksom på problemet. Men det er selvf. ikke værre end at jeg i alle
metoderne tjekker om objektet er oprettet korrekt. Eneste ulempe er så hvis
dem der opretter objekterne ikke er pæne og benytter sig af at man ikke kan
erklære private variable i PHP...

/Dann



Per Thomsen (27-08-2002)
Kommentar
Fra : Per Thomsen


Dato : 27-08-02 10:17

Dann Pedersen wrote:
> "Per Thomsen" <pert@pert.dk> wrote in message
> news:3D6ABDC6.2070204@pert.dk...
>
[snip]
>
> Det skulle det - ellers vil du lave en ny variabel med lokalt scope til den
> enkelte funktion - når den så var færdig med at blive kørt ville indholdet
> være tabt.
>

Øh.. ja... det var også det jeg mente.
Altså at
   $bar = "hejsa";
virker ikke men,
   $this->bar = "hejsa";
virker.

Det er vi nu nok enige om og det er forså vidt irrelevant for denne
tråds "hovedemne".
   

[snip]
>
>>Jeg ville nok foretrække at være sikker på at et objekt skal konstrueres
>>før jeg kalder constructoren.
>
>
> Helt klart også min holdning. Problemet er konkret at et objekt bliver
> genereret på baggrund af noget indhold i en database. Dem der kalder
> objektet opretter det så det repræsentere en post i en database. Hvis nu
> posten ikke eksistere, så er det problematisk at der er et objekt, der ikke
> har noget indhold. Og da det ikke er mig, der står for at oprette objekterne
> i koden, vil jeg gerne være sikker på at der er en tilhørende post i
> databasen. Det kunne være smart hvis man i constructoren kunne gøre kalderen
> opmærksom på problemet. Men det er selvf. ikke værre end at jeg i alle
> metoderne tjekker om objektet er oprettet korrekt. Eneste ulempe er så hvis
> dem der opretter objekterne ikke er pæne og benytter sig af at man ikke kan
> erklære private variable i PHP...
>

Hvis jeg forstår det korrekt, så er det sådan at nogle (ikke dig)
bladrer igennem en tabel og opretter objekter til hver række, er det
korrekt?

Du har så ansvaret for at skrive den klasse som hver række skal være en
instans af.

Ellers så har de noget indhold i en database, der gør at de ønsker at
hente noget tilhørende indhold, og derfor opretter et objekt der kan
finde ud af at hente det.

Under alle omstændigheder bør de ikke konstruere dit objekt før de ved
at der i databasen er en tilsvarende post. Det er du vist enig med mig
i, men det er de ikke, eller...? Forsøger du bare at håndtere den
situation at hvis der nu er fejl i deres kode, således at de rent
faktisk forsøger at oprette objekter som ikke har repræsentanter i
databasen?

Hvis det første er tilfældet ville jeg nok slå dem hårdt i hovedet med
noget tungt, indtil de makker ret ;).

Hvis det andet er tilfældet, ja så er det jo en fejl, og trigger_error
er den korrekte måde at håndtere det på. Medmindre selvfølgelig at i
bruger en anden metode til at håndtere fejl, men essensen er at det så
(IMHO) ville være i orden at melde en fejl, og dø.


MVH Per Thomsen,
http://www.pert.dk/


Martin Mouritzen (27-08-2002)
Kommentar
Fra : Martin Mouritzen


Dato : 27-08-02 11:36

After I finished the 3 Pan Galactic Gargle Blasters, Per Thomsen
<pert@pert.dk> just offered me, he muttered some weird stuff, and I
had to correct this gibberish:

>Øh.. mon ikke det skulle have været:
>   $this->bar = "hejsa";

Selvfølgelig, det var en glemsel

>Jeg tror ikke det første virker, men jeg
>er ikke sikker.

Ikke til dét jeg ville benytte den til ihvertfald
--
Nano Martin Mouritzen Phone +45 27105580
Vesterbrogade 30C. 2. Programmer Advanced Simplicity
DK-8000 Århus martin@nano.dk http://www.nano.dk
Nano nu officiel dansk distributør af UltraEdit, se mere på websitet

Nezar Nielsen (27-08-2002)
Kommentar
Fra : Nezar Nielsen


Dato : 27-08-02 20:50

Dann Pedersen wrote:
> Hejsa,
>
> Jeg har to spørgsmål, der hænger tæt sammen. Når jeg laver et nyt objekt
> vha. new kommandoen, har jeg så nogen mulighed for at fange en eventuel
> værdi som constructoren returnere i klassen samtidig med at den laver
> objektet?

Jeg har testet lidt, og det ser det ikke ud til :/

> Derudover vil jeg meget gerne vide om der er andre muligheder end die for at
> stoppe et objekt i at blive lavet i en constructor.

Ja, det er der.

Du kan bare vælge at sætte $this til null, eller evt. sætte det til at
være noget andet end en instans af den klasse man skulle tro...

Jeg har lavet et lille eksempel hvor du kan se:
http://linux.control.dk/eksempler/oo/constructors_and_returnvals.php

--
Mvh. Nezar Nielsen

Nano - Advanced Simplicity
http://www.nano.dk/


Søg
Reklame
Statistik
Spørgsmål : 177520
Tips : 31968
Nyheder : 719565
Indlæg : 6408659
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste