/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Et sp. om variabler
Fra : Stig Holmberg


Dato : 27-04-09 01:40

Jeg har 2 variabler, $to= 2 og $tre= 3 som jeg kommer i mit array, $test.
Jeg multiplicerer nu værdien af mine 2 variabler i arrayet ved hjælp af
foreach.

Jeg kunne nu forestille mig at de oprindelige variabler havde ændret værdi,
men det er ikke tilfældet, det er kun variablerne i arrayet der har ændret
sig så vi får:

Den oprindelige to: 2
Den oprindelige tre: 3
Den nye to: 4
Den nye tre: 6

Fra nedenstående.

Det forstår jeg ikke helt, kunne forestille mig at problematikken var tæt på
det jeg spurgte om i går.

Mvh. Stig

<?php
$to= 2;
$tre= 3;
$test = array($to,$tre);

foreach($test as $key => $value){
$test[$key] = $value * 2;
}
echo "Den oprindelige to: " . $to . "<br />";
echo "Den oprindelige tre: " . $tre . "<br />";

echo "Den nye to: " . $test[0] . "<br />";
echo "Den nye tre: " . $test[1] . "<br />";
?>


 
 
Bertel Lund Hansen (27-04-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-04-09 08:14

Stig Holmberg skrev:

> Jeg har 2 variabler, $to= 2 og $tre= 3 som jeg kommer i mit array, $test.
> Jeg multiplicerer nu værdien af mine 2 variabler i arrayet ved hjælp af
> foreach.

> Jeg kunne nu forestille mig at de oprindelige variabler havde ændret værdi,
> men det er ikke tilfældet, det er kun variablerne i arrayet der har ændret
> sig så vi får:

Arrayet bliver ikke fyldt op med henvisninger (i programmerings
hedder det "en reference") til de variable der indgår. Det bliver
kun fyldt op med konstante værdier - variablene bliver oversat
når arrayet oprettes.

Man kunne godt tænke sig et sprog hvor det var en reference der
blev lagret i arrayet, men konsekvenserne ville være
uoverskuelige. Hvis man f.eks. i det sprog ville oprette to
arrays:

   $test = array($to,$tre);

   $nytest = array($tre,$to);

og man så ændrer i ét array, slår ændringen så igennem både i det
andet array og i grundvariablene. Det ville være uoverskueligt.

Imidlertid har flere sprog, og heriblandt også PHP, mulighed for
at man selv kan specificere en reference. Jeg ved dog ikke om det
er smart at du begynder at rode med det endnu for som sagt kan
man lave noget værre spaghetti på den måde, men muligheden er
uundværlig for den der ved hvad den skal bruges til.

Eksempel 1 uden reference:
   $syv = 7;
   $cirkasyv = $syv;
   $cirkasyv -= 1;
   echo $syv.' '.$cirkasyv;
Udskrift:   7 6

Eksempel 2 med reference:
   $syv = 7;
   $cirkasyv = &$syv; // reference til $syv
   $cirkasyv -= 1;
   echo $syv.' '.$cirkasyv;

Udskrift:   6 6

Hvis du vil have et array med referencer - som altså kan ændre
grundvariablene - skal du skrive sådan:

   $test = array(&$to,&$tre);

Jeg bruger referencer til at overføre 'kendskab' til en variabel
inden i en funktion:

   function skriv_skema (&$partier,$ug) { ...

Alternativet er

   function skriv_skema ($ug) {
      GLOBAL $partier;

Jeg bruger også referencer til blot at få koden til at se
overskuelig ud. Hvis jeg har en variabel der skal bruges flere
steder, og den ser rodet ud:

   $initarray[$xkoordinat[$lang]][$ykoordinat[$kort]]

så kan jeg erstatte den sådan:


$short_var=&$initarray[$xkoordinat[$lang]][$ykoordinat[$kort]]

Så kan jeg i resten af koden bruge det korte navn med præcis
samme effekt som det lange. Det sparer også lidt beregningstid.
Jeg finder dog altid et bedre beskrivende variabelnavn end blot
"short_var".

> Det forstår jeg ikke helt, kunne forestille mig at problematikken var tæt på
> det jeg spurgte om i går.

Tjo, der er lighedspunkter.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Stig Holmberg (27-04-2009)
Kommentar
Fra : Stig Holmberg


Dato : 27-04-09 23:05


"Bertel Lund Hansen skrev

> Arrayet bliver ikke fyldt op med henvisninger (i programmerings
> hedder det "en reference") til de variable der indgår. Det bliver
> kun fyldt op med konstante værdier - variablene bliver oversat
> når arrayet oprettes.

Aha, nu forstår jeg, det er ikke "variablen" der bliver lagret i arrayet,
men dens værdi, det svarer til at man havde skrevet værdierne manuelt ind.

> Man kunne godt tænke sig et sprog hvor det var en reference der
> blev lagret i arrayet, men konsekvenserne ville være
> uoverskuelige. Hvis man f.eks. i det sprog ville oprette to
> arrays:
>
> $test = array($to,$tre);
>
> $nytest = array($tre,$to);
>
> og man så ændrer i ét array, slår ændringen så igennem både i det
> andet array og i grundvariablene. Det ville være uoverskueligt.

Kan godt se at man skal pase på hvad man laver, især hvis man har en del
linier at holde rede på.

> Imidlertid har flere sprog, og heriblandt også PHP, mulighed for
> at man selv kan specificere en reference. Jeg ved dog ikke om det
> er smart at du begynder at rode med det endnu for som sagt kan
> man lave noget værre spaghetti på den måde, men muligheden er
> uundværlig for den der ved hvad den skal bruges til.
>
> Eksempel 1 uden reference:
> $syv = 7;
> $cirkasyv = $syv;
> $cirkasyv -= 1;
> echo $syv.' '.$cirkasyv;
> Udskrift: 7 6
>
> Eksempel 2 med reference:
> $syv = 7;
> $cirkasyv = &$syv; // reference til $syv
> $cirkasyv -= 1;
> echo $syv.' '.$cirkasyv;
>
> Udskrift: 6 6
>
> Hvis du vil have et array med referencer - som altså kan ændre
> grundvariablene - skal du skrive sådan:
>
> $test = array(&$to,&$tre);

Det er lige præcis den funktionalitet jeg ledte efter, super!

> Jeg bruger referencer til at overføre 'kendskab' til en variabel
> inden i en funktion:
>
> function skriv_skema (&$partier,$ug) { ...

Så dette gør du fordi du ønsker at funktionen skal ændre din oprindelige
variabel?
for værdien af variabel $partier er jo "kendt" fordi den er argument.

> Alternativet er
>
> function skriv_skema ($ug) {
> GLOBAL $partier;
>
> Jeg bruger også referencer til blot at få koden til at se
> overskuelig ud. Hvis jeg har en variabel der skal bruges flere
> steder, og den ser rodet ud:
>
> $initarray[$xkoordinat[$lang]][$ykoordinat[$kort]]
>
> så kan jeg erstatte den sådan:
>
>
> $short_var=&$initarray[$xkoordinat[$lang]][$ykoordinat[$kort]]
>
> Så kan jeg i resten af koden bruge det korte navn med præcis
> samme effekt som det lange. Det sparer også lidt beregningstid.
> Jeg finder dog altid et bedre beskrivende variabelnavn end blot
> "short_var".

Ja, sigende navne hjælper en på sigt, og det er smart at "pakke" variablen
på den måde.

>> Det forstår jeg ikke helt, kunne forestille mig at problematikken var tæt
>> på
>> det jeg spurgte om i går.
>
> Tjo, der er lighedspunkter.

Tak igen, for forklaringen, det går stødt fremad her bag skærmen

Mvh. Stig


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste