IK heb een datetime die ik naar een functie stuur en daar wijzig. Als ik terug kom uit de functie is mijn oorspronkelijke datetime ook gewijzigd. Hoe kan dat?

<?php
$SessionDate = new DateTime("2016-11-01");
  $MyKalender = new Kalender();
  print "<br>1) ";
  print $SessionDate->format("d/m/Y"); // 01/11/2016
  $MyKalender->GetKalData($SessionDate, $PersoonID);
  print "<br>2) ";
  print $SessionDate->format("d/m/Y"); // 01/12/2016
  $MyKalender->DisplayKalender($SessionDate);
  print "<br>3) ";
  print $SessionDate->format("d/m/Y"); // 01/12/2016
?>

Dat is ook mijn vraag. Maar ik heb nog steeds geen antwoord.
Jawel, dat heb je wel. Je datum wordt by reference meegegeven en daardoor kan de functie je datum wijzigen. De oplossing is om deze te clonen, of zoals genoemd in dat topic te serializen en te unserializen.
Of zorgen dat je deze inhoudelijk niet wijzigt in de implementatie van GetKalData().

Dit is duidelijk niet de bedoeling = ongewest gedrag = bug.

Je bouwt in feite een nieuwe datum, creeer dan ook een nieuw datum-object.

En ja, als je het principe van call by reference bijster bent dan zul je nog voor veel onverklaarbaar gedrag komen te staan als je met classes en objecten werkt.
Manu, ik vind dat je een hele goede en logische vraag stelt.

PHP gaat bij objecten "Opeens" variabelen 'by Reference' gebruiken waar bij alle andere variabelen zoals strings, array's en integers variabelen 'by Value' gebruikt worden. PHP is hierin erg onduidelijk.

<?php

$vandaag = new \DateTime();

?>

De vraag die je zou kunnen stellen wat zit er in de variabele $vandaag ?

Antwoord: een verwijzing naar een bepaalde plek in het RAM geheugen van je computer. In de programmeertaal C zouden ze dat een pointer noemen. Dit is ook tevens de reden van het keyword new. Dit keyword reserveert ook daadwerkelijk een stuk geheugen elders op je pc en maakt daar een nieuw DateTime object in en geef het adres van dit stuk geheugen terug.

Als je dan vervolgens dit doet:
<?php
$copy = $vandaag;
?>

Dan kopieer je dus geen object maar enkel de verwijzing naar het object (Het geheugenadres dus). Immers om een nieuw object te maken moet je het keyword new gebruiken.

Zoals hierboven reeds vermeld kun je eventueel een object clonen. Informatie hierover vindt je hier.
Bedankt.

Ik wist niet dat een object, datetime dus, by reference werd doorgegeven. Ik dacht dat alles by value was.

Reageren