[php] Bug in overerving van klassen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Ik weet niet zeker of ik tegen een bug ben aangelopen of dat ik toch iets verkeerd doe hier.

Het volgende statement print '123' in plaats van '456'. Het lijkt er op dat manipulaties van buitenaf in de parent-klasse niet zichtbaar zijn in child-klassen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class a {
    private $str = "123";
    
    public function manipulate($str) {
        $this->str = $str;
    }
    
    public function __toString() {
        return $this->str;
    }
}

class b extends a {
}

$insA = new a();
$insB = new b();

$insA->manipulate("456");

echo $insB;

Het volgende statement print dus '123' in plaats van het '456' dat je zou verwachten.

Dit lijkt me toch echt verkeerd, in Java werkt zoiets wel :)

[ Voor 15% gewijzigd door oogapp0ltje op 19-02-2006 18:35 ]

| To acknowledge what is known as known and what is not known as known is knowledge. |


Acties:
  • 0 Henk 'm!

  • Millennium
  • Registratie: Augustus 2000
  • Laatst online: 14-09 18:02

Millennium

Bug free !!!

Lijkt me toch correct gedrag.
Stel dat je 2 instanties van class a maak, dan is het niet wenselijk dat als je iets wijzigt in de een deze wijziging invloed heeft in de 2e.

[ Voor 3% gewijzigd door Millennium op 19-02-2006 18:44 ]

Rampen bak 2004


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
$insB is een andere instance dan $insA, dus lijkt me dit wel het gewenste resultaat (het zou me pas vreemd lijken als wat jij verwacht de uitkomst zou zijn).

Probeer deze code anders ook eens, misschien dat het dan wat duidelijker is.
PHP:
1
2
3
4
5
6
7
8
$insA = new a();
$insB = new b();

$insA->manipulate("456");
echo $insA; // 456
$insB->manipulate("789");
echo $insB; // 789
echo $insA; // 456


Ik denk ook niet dat java een ander resultaat zal geven als php in dit geval, ik vermoed dat je je gewoon ergens op hebt verkeken / iets over het hoofd hebt gezien ;).

edit:
hmm, ben traag... :Z :P

[ Voor 7% gewijzigd door Shadowman op 19-02-2006 18:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
$insA = new a();
$insB = new b();

$insA->manipulate("456");

echo $insB;


Ehm, je echoot insB, terwijl je 'manipulate' van insA aan hebt geroepen. Het lijkt me volkomen correct dat er niets binnen insB veranderd is nadat je een functie in insA hebt aangeroepen, aangezien het twee verschillende instanties van verschillende klassen zijn?

Of mis ik hier totaal het punt...

Acties:
  • 0 Henk 'm!

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Verwijderd schreef op zondag 19 februari 2006 @ 18:42:
PHP:
1
2
3
4
5
6
$insA = new a();
$insB = new b();

$insA->manipulate("456");

echo $insB;


Ehm, je echoot insB, terwijl je 'manipulate' van insA aan hebt geroepen. Het lijkt me volkomen correct dat er niets binnen insB veranderd is nadat je een functie in insA hebt aangeroepen, aangezien het twee verschillende instanties van verschillende klassen zijn?

Of mis ik hier totaal het punt...
ik echo $insB omdat deze de functie __toString overerft van A

| To acknowledge what is known as known and what is not known as known is knowledge. |


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Ravenof schreef op zondag 19 februari 2006 @ 18:44:
[...]

ik echo $insB omdat deze de functie __toString overerft van A
Je verandert data in de instance van $insA, deze staat fysiek in het geheugen op een andere plek dan $insB welke dus niet veranderd wordt ;).

Acties:
  • 0 Henk 'm!

  • Millennium
  • Registratie: Augustus 2000
  • Laatst online: 14-09 18:02

Millennium

Bug free !!!

Ravenof schreef op zondag 19 februari 2006 @ 18:44:
[...]

ik echo $insB omdat deze de functie __toString overerft van A
klopt. De class erft de complete functionaliteit incl variablen definities over van de parent.
Maar het feit blijft dat je 2 instanties maakt. Waarbij elke instantie en apart stuk geheugen reserveerd voor de inhoud van de veriablen. Wijzigingen in A zijn dus alleen geldig voor A, en wijzigen in de variablen van B alleen beschikbaar voor B. Ze schrijven dus niet naar de zelfde variablen (wel kwa naam, maar niet kwa geheugen lokatie)

edit:
Ben traag :Z :P

[ Voor 3% gewijzigd door Millennium op 19-02-2006 18:49 ]

Rampen bak 2004


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Hij overerft hem van je classe A, niet van je instancie insA.

[ Voor 7% gewijzigd door frickY op 19-02-2006 18:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt 2 klasses, a en b. Klasse B erft van klasse A.

Nu instantieer je twee objecten, een van klasse a en een van klasse b. Dat zijn dus twee op zichzelf staande objecten die niets met elkaar te maken hebben, met dien verstande dan dat ze wel van dezelfde basisklasse afkomstig zijn.

Het is dan ook niet raar dat iets wat je in het ene object zet ("123") niet bij het andere object eruit komt.

Dit werkt ook in Java niet zo en duidt op een behoorlijk onbegrip van wat classes en objecten zijn, nofi.

Als dit in Java wel zou zou werken (wat niet zo is) dan zou dat een heel ernstige bug in Java zijn.

[ Voor 11% gewijzigd door Verwijderd op 19-02-2006 18:49 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Ravenof schreef op zondag 19 februari 2006 @ 18:44:
[...]

ik echo $insB omdat deze de functie __toString overerft van A
Dat klopt, maar instantie A is een pointer naar een ander stuk geheugen dan instantie B. Dus alles wat je in A veranderd gebeurd niet in B. (Dat zou je ook helemaal niet willen op deze manier) Het is alleen zo dat B dezelfde, of meer, methoden heeft als A. Maar het zijn dus wel 2 verschillende objecten in je geheugen.

Als ik jouw was zou ik me nog even meer verdiepen in de grappen en grollen van het object georienteerde programmeren.

[ Voor 11% gewijzigd door Sybr_E-N op 19-02-2006 18:53 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Dit is gewoon perfect juist gedrag. Je hebt 2 instanties van één class. Iedere instantie (object) heeft z'n eigen 'kopieën' van variablen.

Zolang die $str variable niet static is, is hetgeen ge-output wordt gewoon correct.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 07-09 09:59
ik zou eerst een boek lezen over de algemen principes van OO. Misschien dat je hier wel iets in terug vindt.

[rml][ Alg] Centraal boekentopic - part II[/rml]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 18-09 22:40

Nick_S

++?????++ Out of Cheese Error

Dit zou incorrect gedrag zijn in Java als je de variabele static had gemaakt. Dan zou deze voor alle instanties (eigen klasse of subklasse) gelijk moeten blijven.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'

Pagina: 1