PDA

Bekijk Volledige Versie : [PHP] Zwaar probleem in OO in PHP 4



Tjerk Wolterink
14/01/05, 16:45
Ik heb een probleem in mijn webapplicateis,
ik maak ontzettend veel gebruik van classes, slechts weinig gewone functies.
Zo heb ik een klasse $page en $admin. De admin is een attribuut van $page.

Maar nu heb ik een probleem, het script begint in functie A: ik veranderd admin.
vervolgesn ergens anders in het script (functie B) is admin niet veranderd.
Ik dacht dat dit met references te maken had, dus heb ik een methode get_admin
voor een page object gemaakt:

function &get_admin() {
return $this->xcd_admin;
}

Dmv de & zou ik dus een reference naar xcd_admin moeten krijgen. Maar dit lijkt niet het geval.
dus ik denk: ik ga ff debugggen. Maar ik kan geen manier vinden om te checken of 2 objecten identiek zijn.
Let op: identiek, niet equal maar identiek. Dus of ze een reference zijn naar hetzelfde object.
Hoe doe ik dat in php?

Rene Pijlman
14/01/05, 17:55
Tjerk Wolterink:
>Maar ik kan geen manier vinden om te checken of 2 objecten identiek zijn.
>Let op: identiek, niet equal maar identiek. Dus of ze een reference zijn
>naar hetzelfde object. Hoe doe ik dat in php?

Het staat gewoon in de documentatie hoor, precies op de plaats waar het
hoort te staan.
http://www.php.net/manual/en/language.oop.php ("comparing objects")

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Tjerk Wolterink
14/01/05, 18:15
Rene Pijlman wrote:
> Tjerk Wolterink:
>
>>Maar ik kan geen manier vinden om te checken of 2 objecten identiek zijn.
>>Let op: identiek, niet equal maar identiek. Dus of ze een reference zijn
>>naar hetzelfde object. Hoe doe ik dat in php?
>
>
> Het staat gewoon in de documentatie hoor, precies op de plaats waar het
> hoort te staan.
> http://www.php.net/manual/en/language.oop.php ("comparing objects")
>

Net voordat ik de vraag poste had ik dat al gelezen,
en precies daar staat comparing objetcs,

Two object instances are equal if they have the same attributes and values, and are instances of the same class.

Maar wat ik wil:

Wanner zijn wijzen 2 variablen naar de zelfde instantie van een bepaalde class?
Dus NIET: wanneer zijn 2 object instanties equal.
Maar wanneer zijn 2 object instances identical.

Of is dat gewoon === ??
Volgesn de documentatei neit want er staat:

Similar rules are applied when comparing two objects using the identity operator (===).
Dus voor === geldt hetzelde als ==

Wat ik dus bedoel:


$a=new ObjectA();
$a.attribuut=true;

$b=new ObjectA();
$b.attribuut=true;

// reference a
$c=&$a;
// geen reference d wordt dus een kopie van a
$d=$a;

nu geldt:

$a identical $a = true
$a equals $a = true

$a identical $b = false
$a equals $b = true

$a identical $c = true
$a equals $c = true

$a identical $d = false
$a equals $d = true

Snappie?

Rene Pijlman
14/01/05, 18:25
Tjerk Wolterink:
>Rene Pijlman:
>> Het staat gewoon in de documentatie hoor, precies op de plaats waar het
>> hoort te staan.
>> http://www.php.net/manual/en/language.oop.php ("comparing objects")
>
>Net voordat ik de vraag poste had ik dat al gelezen,
>en precies daar staat comparing objetcs,

Ik snap de verwarring, maar de truc bij PHP is dat je niet zozeer de
documentatie zelf moet lezen, maar de user comments eronder.

"In the constructor of your object, set a 'serial' attribute from a global
variable that is incremented whenever a new object is created. Then you
just have to compare serial numbers to see if the objects are the same."

Als ik het goed begrijp, heeft dit niet alleen effect op de
identiteitscheck, maar ook op de gelijkheidscheck (equality). Er komt
immers een attribuut met een uniek nummer bij. Twee niet-identieke
objecten die voorheen gelijk waren, zijn dat na toepassing van dit systeem
niet meer.

PHP is de belachelijkste populaire programmeertaal ooit.

Na Mix, Cobol, Fortran, Basic, Perl en C natuurlijk.

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Tjerk Wolterink
14/01/05, 18:35
Rene Pijlman wrote:

> Tjerk Wolterink:
>
>>Rene Pijlman:
>>
>>>Het staat gewoon in de documentatie hoor, precies op de plaats waar het
>>>hoort te staan.
>>>http://www.php.net/manual/en/language.oop.php ("comparing objects")
>>
>>Net voordat ik de vraag poste had ik dat al gelezen,
>>en precies daar staat comparing objetcs,
>
>
> Ik snap de verwarring, maar de truc bij PHP is dat je niet zozeer de
> documentatie zelf moet lezen, maar de user comments eronder.
>
> "In the constructor of your object, set a 'serial' attribute from a global
> variable that is incremented whenever a new object is created. Then you
> just have to compare serial numbers to see if the objects are the same."

verdomd je hebt gelijk

> Als ik het goed begrijp, heeft dit niet alleen effect op de
> identiteitscheck, maar ook op de gelijkheidscheck (equality). Er komt
> immers een attribuut met een uniek nummer bij. Twee niet-identieke
> objecten die voorheen gelijk waren, zijn dat na toepassing van dit systeem
> niet meer.

Volgens mij heb je gelijk

>
> PHP is de belachelijkste populaire programmeertaal ooit.
>
> Na Mix, Cobol, Fortran, Basic, Perl en C natuurlijk.
>

Volgens mij heeft php 5.0 wel aar dig wat verbeteringen.

Maar iig bedankt.

Erick T. Barkhuis
14/01/05, 18:45
Rene Pijlman [on Fri, 14 Jan 2005 18:20:41 +0100] wrote:

> Ik snap de verwarring, maar de truc bij PHP is dat je niet zozeer de
> documentatie zelf moet lezen, maar de user comments eronder.

Die zijn vaak nuttig. Er zit overigens ook veel geblaat tussen.

> "In the constructor of your object, set a 'serial' attribute from a global
> variable that is incremented whenever a new object is created. Then you
> just have to compare serial numbers to see if the objects are the same."
>
> Als ik het goed begrijp, heeft dit niet alleen effect op de
> identiteitscheck, maar ook op de gelijkheidscheck (equality).

Tuurlijk. Ik kan me dus niet voorstellen dat de bedenkers van PHP zo'n
oplossing voor ogen hadden.

> PHP is de belachelijkste populaire programmeertaal ooit.

Zou kunnen. In elk geval is PHP populair, en doet dus iets goed.

> Na Mix,

Wellicht

> Cobol,

Ho vriend, nou moet je oppassen!
:-)

--
Erick

"Ik denk dat we in het geval van de Wallen toch beter van 'Sheet-style'
kunnen spreken - 2B's in niwo

Rene Pijlman
14/01/05, 19:15
Erick T. Barkhuis:
>Rene Pijlman:
>> Als ik het goed begrijp, heeft dit niet alleen effect op de
>> identiteitscheck, maar ook op de gelijkheidscheck (equality).
>
>Tuurlijk. Ik kan me dus niet voorstellen dat de bedenkers van PHP zo'n
>oplossing voor ogen hadden.

Idd. Het lijkt erop dat de bedenkers van PHP (t/m versie 4) niet hebben
gedacht aan object identity.

>> PHP is de belachelijkste populaire programmeertaal ooit.
>
>Zou kunnen. In elk geval is PHP populair, en doet dus iets goed.

Het heeft de charme van de eenvoud, voor hullie die HTML kennen en nog
geen programmeerachtergrond hebben.

Ik moet toegeven dat ik het ook weleens gebruik, voor simpele webditjes en
-datjes.

Maar waarom iemand er iets serieus object georienteerds mee zou willen
maken ontgaat me.

>> Cobol,
>
>Ho vriend, nou moet je oppassen!
>:-)

Hoe ging dat ook alweer?

PLEASE UPDATE COUNT LET COUNT IS SUBTRACT ONE FROM COUNT AS LONG AS
COUNT DOES NOT BECOME NEGATIVE THEREBY NOR THEREFORE

ofzo!?

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Erick T. Barkhuis
14/01/05, 19:35
Rene Pijlman [on Fri, 14 Jan 2005 19:12:22 +0100] wrote:
> Erick T. Barkhuis:

> >> Cobol,
> >
> >Ho vriend, nou moet je oppassen!
> >:-)
>
> Hoe ging dat ook alweer?
>
> PLEASE UPDATE COUNT LET COUNT IS SUBTRACT ONE FROM COUNT AS LONG AS
> COUNT DOES NOT BECOME NEGATIVE THEREBY NOR THEREFORE
>
> ofzo!?

Zoiets, ja. Uiteraard valt jouw statement niet te compileren wegens
ontbrekende punt.

PERFORM EMPTY_BOTTLE UNTIL BOTTLE_EMPTY.

Simpel, toch?



--
Erick

"The right to be heard does not include the right to be taken seriously."
- Hubert Humphrey

Michiel de Roo
14/01/05, 21:35
Tjerk Wolterink wrote:
> Ik heb een probleem in mijn webapplicateis,
> ik maak ontzettend veel gebruik van classes, slechts weinig gewone
> functies.
> Zo heb ik een klasse $page en $admin. De admin is een attribuut van $page.
>
> Maar nu heb ik een probleem, het script begint in functie A: ik
> veranderd admin.
> vervolgesn ergens anders in het script (functie B) is admin niet veranderd.
> Ik dacht dat dit met references te maken had, dus heb ik een methode
> get_admin
> voor een page object gemaakt:
>
> function &get_admin() {
> return $this->xcd_admin;
> }
>
> Dmv de & zou ik dus een reference naar xcd_admin moeten krijgen. Maar
> dit lijkt niet het geval.
> dus ik denk: ik ga ff debugggen. Maar ik kan geen manier vinden om te
> checken of 2 objecten identiek zijn.
> Let op: identiek, niet equal maar identiek. Dus of ze een reference zijn
> naar hetzelfde object.
> Hoe doe ik dat in php?
>
>

Het grote probleem is dat PHP hier gebruikt maakt van references en niet
van pointers. Voor zover ik weet is er in PHP geen functie om twee
references te vergelijken, waarschijnlijk omdat het geen triviaal iets is
om te doen. Twee pointers vergelijken is makkelijk, als de adressen die
erin staan gelijk zijn, is het hetzelfde object. Maar een reference is
volgens mij niet iets 'fysieks' in de zin dat het bitjes in het geheugen
zijn in runtime, dus is er ook niet veel te vergelijken in runtime.

Voor objecten kun je echter wel een lelijke functie maken die dit mogelijk
maakt:

<?
function compare_objects(&$a, &$b) {
$a->very_ugly_compare_test = true;
if($b->very_ugly_compare_test) $return = true;
$a->very_ugly_compare_test = false;
return $return;
}

class Object {
}

$a = new Object();
$b = $a;
$c =& $a;

echo compare_objects($a, $b)?"1":"0";
echo compare_objects($a, $c)?"1":"0";
?>

References i.pv. pointers voor objecten zijn IMHO de plaag van PHP. Het
levert bij mij vaak onverwachte en vreemdsoortige fouten op.


gr, michiel.

Rene Pijlman
14/01/05, 21:55
Michiel de Roo:
>Het grote probleem is dat PHP hier gebruikt maakt van references en niet
>van pointers.

Dat laatste kan wel of niet waar zijn, maar dat is niet het probleem. Als
het niet waar is, dan spreekt dit vanzelf. Als het wel waar is, dan is het
probleem dat er geen identiteit-operatie is op references, en dat is dus
een ander probleem.

>Voor zover ik weet is er in PHP geen functie om twee references te vergelijken

Dat zeg ik :-)

>waarschijnlijk omdat het geen triviaal iets is om te doen.

Ik kan mij niets trivialers voorstellen.

>Twee pointers vergelijken is makkelijk, als de adressen die
>erin staan gelijk zijn, is het hetzelfde object.

Dat is bij references niet anders.

>Maar een reference is volgens mij niet iets 'fysieks' in de zin dat het
>bitjes in het geheugen zijn in runtime

Hola! Wat voor metafysisch zou het dan kunnen zijn?

>References i.pv. pointers voor objecten zijn IMHO de plaag van PHP. Het
>levert bij mij vaak onverwachte en vreemdsoortige fouten op.

Ik kan me hier niets bij voorstellen. Geen enkele pure en/of behoorlijke
OO-taal kent pointers. Java is een volstrekt volwaardige OO-taal en heeft
geen pointers.

Een reference is eigenlijk niets anders dan een pointer met een paar
restricties. Met name de restricties:

1. Het is een pointer die naar een object van een bepaald type wijst (in
plaats van een willekeurig adres in de adresruimte van het onderliggend
virtueel geheugen).

2. Er kunnen geen berekeningen mee worden uitgevoerd (je kunt niet zoals
in C p+4 derefereren).

Zie http://mindprod.com/jgloss/pointer.html voor meer restricties.

Deze beperkingen kunnen (deels) compile time worden gecontroleerd, maar
dat neemt niet weg dat het runtime eigenlijk gewoon pointers zijn.

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Michiel de Roo
14/01/05, 21:55
Michiel de Roo wrote:
> Tjerk Wolterink wrote:
>
>> Ik heb een probleem in mijn webapplicateis,
>> ik maak ontzettend veel gebruik van classes, slechts weinig gewone
>> functies.
>> Zo heb ik een klasse $page en $admin. De admin is een attribuut van
>> $page.
>>
>> Maar nu heb ik een probleem, het script begint in functie A: ik
>> veranderd admin.
>> vervolgesn ergens anders in het script (functie B) is admin niet
>> veranderd.
>> Ik dacht dat dit met references te maken had, dus heb ik een methode
>> get_admin
>> voor een page object gemaakt:
>>
>> function &get_admin() {
>> return $this->xcd_admin;
>> }
>>
>> Dmv de & zou ik dus een reference naar xcd_admin moeten krijgen. Maar
>> dit lijkt niet het geval.
>> dus ik denk: ik ga ff debugggen. Maar ik kan geen manier vinden om te
>> checken of 2 objecten identiek zijn.
>> Let op: identiek, niet equal maar identiek. Dus of ze een reference
>> zijn naar hetzelfde object.
>> Hoe doe ik dat in php?
>>
>>
>
> Het grote probleem is dat PHP hier gebruikt maakt van references en niet
> van pointers. Voor zover ik weet is er in PHP geen functie om twee
> references te vergelijken, waarschijnlijk omdat het geen triviaal iets
> is om te doen. Twee pointers vergelijken is makkelijk, als de adressen
> die erin staan gelijk zijn, is het hetzelfde object. Maar een reference
> is volgens mij niet iets 'fysieks' in de zin dat het bitjes in het
> geheugen zijn in runtime, dus is er ook niet veel te vergelijken in
> runtime.
>
> Voor objecten kun je echter wel een lelijke functie maken die dit
> mogelijk maakt:
>
> <?
> function compare_objects(&$a, &$b) {
> $a->very_ugly_compare_test = true;
> if($b->very_ugly_compare_test) $return = true;
> $a->very_ugly_compare_test = false;
> return $return;
> }
>
> class Object {
> }
>
> $a = new Object();
> $b = $a;
> $c =& $a;
>
> echo compare_objects($a, $b)?"1":"0";
> echo compare_objects($a, $c)?"1":"0";
> ?>
>
> References i.pv. pointers voor objecten zijn IMHO de plaag van PHP. Het
> levert bij mij vaak onverwachte en vreemdsoortige fouten op.
>
>
> gr, michiel.

debiel, vind ik gewoon exact dezelfde oplossing in de documentatie:
http://www.php.net/manual/en/language.references.arent.php
http://www.digiways.com/articles/php/smartcompare/

:-)

Michiel de Roo
14/01/05, 22:05
Rene Pijlman wrote:
> Michiel de Roo:
>
>>Het grote probleem is dat PHP hier gebruikt maakt van references en niet
>>van pointers.
>
>
> Dat laatste kan wel of niet waar zijn, maar dat is niet het probleem. Als
> het niet waar is, dan spreekt dit vanzelf. Als het wel waar is, dan is het
> probleem dat er geen identiteit-operatie is op references, en dat is dus
> een ander probleem.
>
>
>>Voor zover ik weet is er in PHP geen functie om twee references te vergelijken
>
>
> Dat zeg ik :-)
>
>
>>waarschijnlijk omdat het geen triviaal iets is om te doen.
>
>
> Ik kan mij niets trivialers voorstellen.
>
>
>>Twee pointers vergelijken is makkelijk, als de adressen die
>>erin staan gelijk zijn, is het hetzelfde object.
>
>
> Dat is bij references niet anders.
>
>
>>Maar een reference is volgens mij niet iets 'fysieks' in de zin dat het
>>bitjes in het geheugen zijn in runtime
>
>
> Hola! Wat voor metafysisch zou het dan kunnen zijn?

Ik bedoelde meer dat ze een compile time gebeuren zijn, waar je in runtime
niet zomaar beschikking over hebt.

>
>
>>References i.pv. pointers voor objecten zijn IMHO de plaag van PHP. Het
>>levert bij mij vaak onverwachte en vreemdsoortige fouten op.
>
>
> Ik kan me hier niets bij voorstellen. Geen enkele pure en/of behoorlijke
> OO-taal kent pointers. Java is een volstrekt volwaardige OO-taal en heeft
> geen pointers.

Niet expliciet, maar een object gedraagt zich in Java eerder als een
pointer dan als een reference. In Java heb ik bovendien nog nooit een
reference of pointer nodig gehad. In PHP smijt je gewoonlijk met
references, wat het geheel er niet overzichtelijker op maakt.

>
> Een reference is eigenlijk niets anders dan een pointer met een paar
> restricties. Met name de restricties:
>
> 1. Het is een pointer die naar een object van een bepaald type wijst (in
> plaats van een willekeurig adres in de adresruimte van het onderliggend
> virtueel geheugen).
>
> 2. Er kunnen geen berekeningen mee worden uitgevoerd (je kunt niet zoals
> in C p+4 derefereren).
>
> Zie http://mindprod.com/jgloss/pointer.html voor meer restricties.
>
> Deze beperkingen kunnen (deels) compile time worden gecontroleerd, maar
> dat neemt niet weg dat het runtime eigenlijk gewoon pointers zijn.

Ik vraag me af of ze dat bij PHP ooit begrepen hebben ;-)

robert
14/01/05, 22:15
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid>:
> Geen enkele pure en/of behoorlijke OO-taal kent pointers. Java is een
> volstrekt volwaardige OO-taal en heeft geen pointers.
>
> Een reference is eigenlijk niets anders dan een pointer met een paar
> restricties.

Hmm, dus Java heeft wel pointers, alleen hebben die wat restricties...?

--
robert

Rene Pijlman
14/01/05, 22:25
Michiel de Roo:
>Niet expliciet, maar een object gedraagt zich in Java eerder als een
>pointer dan als een reference.

Ja nee, dit is te gek. Hier typten je vingers voordat de daarvoor
benodigde signalen uit de neocortex waren gearriveerd.

>In Java heb ik bovendien nog nooit een reference of pointer nodig gehad.

Met die zelfopgelegde beperking kun je heel weinig met Java.

"2.1 A Simple Class

class Body {
...
}

Body mercury;

This declaration states that mercury is a variable that can hold a
reference to an object of type Body"

Bron: The Java Programming Language.

Dit betreft zo'n beetje het eerste object dat in dit boek wordt gecreëerd,
op bladzijde 36. Oh nee, wacheffe, er is nog geeneens een object gecreëerd
:-)

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Michiel de Roo
14/01/05, 22:35
Rene Pijlman wrote:
> Michiel de Roo:
>
>>Niet expliciet, maar een object gedraagt zich in Java eerder als een
>>pointer dan als een reference.
>
>
> Ja nee, dit is te gek. Hier typten je vingers voordat de daarvoor
> benodigde signalen uit de neocortex waren gearriveerd.
>

Ik ben toch niet enige die dit denkt:
http://javadude.com/articles/passbyvalue.htm

en dan vooral:
To sum up: Java has pointers, and the value of the pointer is passed in.
There's no way to actually pass an object itself as a parameter. You can
only pass a pointer to an object.

Overigens is dit in PHP5 volgens mij ook zo.

>
>>In Java heb ik bovendien nog nooit een reference of pointer nodig gehad.
>
>
> Met die zelfopgelegde beperking kun je heel weinig met Java.
>
> "2.1 A Simple Class
>
> class Body {
> ...
> }
>
> Body mercury;
>
> This declaration states that mercury is a variable that can hold a
> reference to an object of type Body"
>
> Bron: The Java Programming Language.
>
> Dit betreft zo'n beetje het eerste object dat in dit boek wordt gecreëerd,
> op bladzijde 36. Oh nee, wacheffe, er is nog geeneens een object gecreëerd
> :-)
>

Tjerk Wolterink
15/01/05, 12:05
Rene Pijlman wrote:
> Erick T. Barkhuis:
>
<knip>
>
> Het heeft de charme van de eenvoud, voor hullie die HTML kennen en nog
> geen programmeerachtergrond hebben.
>
> Ik moet toegeven dat ik het ook weleens gebruik, voor simpele webditjes en
> -datjes.
>
> Maar waarom iemand er iets serieus object georienteerds mee zou willen
> maken ontgaat me.
>

PHP wordt veel ondersteund, is aardig snel ( volgens mij is dit maar
gedeeltelijk waar )
en het is makkelijk om er in te proggen.
Jammer alleen dat ik er nu pas achter komt dat die object orientatie
echt zo slecht is.
Ik kom van de wereld van Java maar JSP en Servlets is denk ik meer voor
het grotere werk.

Ik denk dat, als php5 als stable wordt gekroond ik (en als miijn
provider het ondersteund) ik het
systeem maar eens ga omschrijven naar PHP5