[PHP] Pointer een tweede leven geven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Ik heb een soort DOM gebouwd in php, op zich werkt dit allemaal leuk. Elk object kent zijn kinderen. Die kinderen kennen zijn kinderen ook weer.

De structuur is dus als volgt"
code:
1
| MASTER OBJECT | --> | parentObject |  --->  | childObject |


Een masterobject kent dus in principe ook al zijn kleinkinderen, maar via de parentobject.
Ik zou dit graag ook de andere kant op doen, dus dat een childobject via zijn parent ook de masterobject kent. opzich niet zo'n probleem zou je denken.

Nu creer ik het childobject een een functie (beperkte scope) en kopier ik deze in een array in het parentobject. Zoiets:
PHP:
1
$parentObject->AddChildData($childObject);


Er wordt dus geen pointer opgeslagen, maar er wordt een kopie gemaakt. In de AddChildData functie wordt er ook gedaan:
code:
1
2
3
4
// De array bevat een kopie van $childObject op index 0
// De parent wordt als pointer opgeslagen.

$this->_arrChildren[0]->SetParent($this);


So far so good, als $childObject doodgaat, dan kent ie zijn parent nog wel. Zodra ik hetzelfde trucje uithaal met de parentNode naar de masterNode toe, en de parentNode gaat dood. Dan is de pointer ook verdwenen van de childNode naar de parentNode.

Hierdoor kan ik de parent nooit dieper dan 1 laag opslaan.

Is het mogelijk de data van een pointer voort te laten bestaan zonder een global van te maken, dit zou namelijk een oplossing zijn, maar erg netjes vind ik het niet.

Een andere optie is om de verantwoordelijkheid van de child en parent niet neer te leggen bij de objecten, maar om dit over te dragen aan een secretaris, hierdoor blijven alle objecten bestaan zolang de secretaris bestaan.

Is mijn probleem duidelijk? Hoe lossen jullie dit op?

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Okee, dat is inderdaad wel verhelderend. Een tweede keer doorlezen geeft toch weer meer inzicht dan de eerste keer (heul lang geleden).

Nu kom ik het volgende tegen:
PHP:
1
$obj =& new BaseObj();


Ik kan alleen niet wijs worden waarom je dit zou doen? Wat maakt dit anders dan een normale instantiering?
Voor de rest ga ik eens het eea proberen met behulp van GLOBAL VAR

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
storeman schreef op dinsdag 03 juli 2007 @ 17:14:
Okee, dat is inderdaad wel verhelderend. Een tweede keer doorlezen geeft toch weer meer inzicht dan de eerste keer (heul lang geleden).

Nu kom ik het volgende tegen:
PHP:
1
$obj =& new BaseObj();


Ik kan alleen niet wijs worden waarom je dit zou doen? Wat maakt dit anders dan een normale instantiering?
Voor de rest ga ik eens het eea proberen met behulp van GLOBAL VAR
Het verschil is dat $obj nu in plaats van een instantie van een object een verwijzing naar de geheugenlocatie van de instantie is. Dus in plaats van telkens een object kopieren en doorsturen naar functies en dergelijke stuur je nu alleen het adres van het object op; veel kleiner natuurlijk, al helemaal als er veel data in het object staat.

Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

YopY schreef op dinsdag 03 juli 2007 @ 21:26:
[...]


Het verschil is dat $obj nu in plaats van een instantie van een object een verwijzing naar de geheugenlocatie van de instantie is. Dus in plaats van telkens een object kopieren en doorsturen naar functies en dergelijke stuur je nu alleen het adres van het object op; veel kleiner natuurlijk, al helemaal als er veel data in het object staat.
Fout, er is helemaal geen verschil. Het is altijd een verwijzing naar de geheugenlocatie van het object (in feite is het een verwijzing naar $this). Vanaf php5 mag dit niet eens (hiervan krijg je een E_STRICT error).

Om nog wat duidelijker te maken dat het al een reference is, try this:
PHP:
1
2
3
4
5
6
7
8
<?php
$obj = new stdClass();

$secondObj = $obj;

$secondObj->name = 'blaat';

echo $obj->name;


Edit: Als je een object wilt 'klonen' kun je dit doen met het clone keyword (vanaf php5).

Dat doe je zo:
PHP:
1
2
3
4
5
6
7
8
<?php
$obj = new stdClass();

$secondObj = clone $obj;

$secondObj->name = 'blaat';

echo $obj->name;


Dat levert een ander resultaat op.

[ Voor 13% gewijzigd door kokx op 03-07-2007 21:37 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Lees even een stukje over het verschil tussen php <5 en php5 :
trucex at gmail dot com
05-May-2007 10:49
In response to Xor and Slava:

I recommend you read up a bit more on the way PHP handles memory management. Take the following code for example:
PHP:
1
2
3
4
5
$data = $_POST['lotsofdata'];
$data2 = $data;
$data3 = $data;
$data4 = $data;
$data5 = $data;


Assuming we post 10MB of data to this PHP file, what will PHP do with the memory?

PHP uses a table of sorts that maps variable names to the data that variable refers to in memory. The $_POST superglobal will actually be the first instance of that data in the execution, so it will be the first variable referenced to that data in the memory. It will consume 10MB. Each $data var will simply point to the same data in memory. Until you change that data PHP will NOT duplicate it.

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

SchizoDuckie schreef op dinsdag 03 juli 2007 @ 21:40:
Lees even een stukje over het verschil tussen php <5 en php5 :


[...]
Dat stukje van mij is alleen van toepassing op objecten hoor. Voor andere types zul je wel een & teken moeten gebruiken om een reference te krijgen.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

SchizoDuckie schreef op dinsdag 03 juli 2007 @ 21:40:
Lees even een stukje over het verschil tussen php <5 en php5 :
Copy-on-write is een implementatie-detail. Semantisch gezien werk je nog altijd met een kopie, want als je $data2 aanpast, dan verandert $data niet automatisch mee. Dat er geheugen uitgespaard wordt op het moment dat je die verandering niet maakt doet er verder weinig toe.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

.oisyn schreef op woensdag 04 juli 2007 @ 12:44:
[...]

Copy-on-write is een implementatie-detail. Semantisch gezien werk je nog altijd met een kopie, want als je $data2 aanpast, dan verandert $data niet automatisch mee. Dat er geheugen uitgespaard wordt op het moment dat je die verandering niet maakt doet er verder weinig toe.
ohjah das waar :)

Stop uploading passwords to Github!

Pagina: 1