[PHP] Object cloning gaat niet als verwacht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
PHP:
1
2
$vi_block = clone $vi;
$vi_page = clone $vi;


Als ik de docs op php.net goed begrepen heb, dan zou in zowel $vi_block als $vi_page een clone van $vi moeten zitten. Dus het veranderen van properties in $vi_block zou geen effect moeten hebben op $vi_page, maar toch gebeurt dat wel. Kan iemand mij misschien vertellen waarom?

Acties:
  • 0 Henk 'm!

  • NilsVG
  • Registratie: April 2008
  • Laatst online: 12-09 16:41

NilsVG

GoT n00bie

Ben je zeker dat de class die in $vi zit wel function __clone() bezit?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dit gezien?
Any properties that are references to other variables, will remain references.

Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
$vi heeft niet zo'n method. Het is gewoon een on-the-fly gegeneerd object zonder class.

@GlowMouse: De properties zijn gewoon integers of strings, niks geen references dus.

[ Voor 33% gewijzigd door Mei op 24-05-2008 20:00 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dan zul je toch met wat voorbeeldcode moeten komen (en geen lap van 200 regels, maar een klein stukje dat net genoeg is om het probleem te zien), want dit is gewoon te weinig informatie. In de code die je hebt gepost zit namelijk geen probleem.
PHP:
1
2
3
4
5
6
7
class vi { public $a; }
$vi = new vi();
$vi->a = 'a';
$vi2 = clone $vi;
$vi3 = clone $vi;
$vi2->a = 'b';
echo $vi3->a; // 'a'

Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
PHP:
1
2
3
4
5
6
7
$result = db_query("SELECT vi.*, voc.vid, voc.name, voc.description FROM {vocabulary} voc LEFT JOIN {vocabindex} vi ON vi.vid = voc.vid WHERE voc.module <> 'forum' ORDER BY voc.name ASC");  
while ($vi = db_fetch_object($result)) {      
  $vi_block = clone $vi;
  $vi_page = clone $vi;
  $vi_block->type = VOCABINDEX_VI_BLOCK;
  $vi_page->type = VOCABINDEX_VI_PAGE;
}


$vi_block en $vi_page blijken achteraf beide dezelfde $type property te bezitten, terwijl de constants gewoon een verschillende waarde hebben.

Acties:
  • 0 Henk 'm!

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

SchizoDuckie

Kwaak

Mei schreef op zaterdag 24 mei 2008 @ 20:07:
PHP:
1
2
3
4
5
6
7
$result = db_query("SELECT vi.*, voc.vid, voc.name, voc.description FROM {vocabulary} voc LEFT JOIN {vocabindex} vi ON vi.vid = voc.vid WHERE voc.module <> 'forum' ORDER BY voc.name ASC");  
while ($vi = db_fetch_object($result)) {      
  $vi_block = clone $vi;
  $vi_page = clone $vi;
  $vi_block->type = VOCABINDEX_VI_BLOCK;
  $vi_page->type = VOCABINDEX_VI_PAGE;
}
Heb je een iets minder wazig stukje voorbeeld code? Ik snap echt totaal even niet waarom je een clone uitvoert op een db query result ín een while loop :?

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Ik kan een hele uitleg geven over waarom die code is zoals hij is, maar ik denk dat het daar alleen maar ingewikkelder van wordt, mede doordat de originele code groter dan dit kleine stukje is.

Laten we het er maar op houden dat ik met het object uit de DB twee verschillende dingen moet doen en voor elke afhandeling een clone van dat object nodig heb.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

En wat doet die db_fetch_object (wat geeft die terug en hoe)? Het belangrijkste stukje laat je weer weg..

[ Voor 16% gewijzigd door Bosmonster op 24-05-2008 22:49 ]


Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Da's gewoon de fetch_object() functie uit de database layer. Zegmaar hetzelfde als mysql_fetch_object() of pg_fetch_object(). Op diezelfde manier werkt db_query(), dat kan je als een pg_query() beschouwen.

Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Hmm, ik heb de hele functie nog even nagelopen en er zaten wat hele kleine foutjes in. Geen idee wat nou precies voor het 'defect' zorgde, maar het werkt nu wel.

Bedankt voor het meedenken :)
Pagina: 1