webForumDet fria alternativet

Globala variabler

7 svar · 353 visningar · startad av aasah

aasahMedlem sedan mars 20034 471 inlägg
#1

I helgen läste jag på https://www.php.net att en variabel som förekommer "löst" i skriptet inte nås i funktioner, utan alla variabler som används i funktioner är kopior. För att motverka detta, om man VILL jobba mot den "globala" variabeln, skulle man skriva något speciellt i funktionen. Idag har jag förgäves försökt hitta samma stycke igen... :( Uppenbarligen skriver jag fel.

<?php
$vect = array("A" => 0, "B" => 0, "C" => 0, "D" => 0);

function update($i) {
   $_GLOBAL = $vect; //???????? Vad borde här stå?

   if (!even($i)) {
	$vect["D"]++;
      $i--;
   }
   ...
}

function printV($vect) {
   foreach ($vect as $key => $value) { 
      echo "$key : $value    "; 
   }
   echo "<BR>";
}
   
for ($j = 0; $j < 15; $j++) {
  if (even($j))
    echo "$j is even.  ";
  else  echo "odd.  ";
  update($j);
  printV($vect);
}

?>

Resultatet blir bara nollor....

K@llenMedlem sedan mars 20032 667 inlägg
#2
global $vect;
aasahMedlem sedan mars 20034 471 inlägg
#3

Tusen tack! :D

SPiNMedlem sedan mars 20007 896 inlägg
#4

Ändock, globala variabler är något som man bör undvika! God programmeringssed är att skicka in sina variabler som parametrar till funktioner och metoder istället.

aasahMedlem sedan mars 20034 471 inlägg
#5

SPiN skrev:

Ändock, globala variabler är något som man bör undvika! God programmeringssed är att skicka in sina variabler som parametrar till funktioner och metoder istället.

Visst, men det funkar ju sämre, minst sagt, när det leder till att $vect kopieras då. (Har inte vågat mig på referenserna än, jag tar just mina första staplande steg i php.) Först trodde jag att referenserna funkade som i C++, men det verkade inte så när jag läste vidare om dom... Man kan visst sätta om dom? :q

SPiNMedlem sedan mars 20007 896 inlägg
#6

Fungerar sämre, nja... Visst kopieras dom, men jag skulle inte vilja påstå att det gör det sämre. Snarare säkrare, eftersom att man har bättre koll på sina variabler och dess värden. Men har man koll på vad man gör, och man har många variabler som inte ändras, m.m. så självklart kan man använda global.

Referenser är relativt lätta, de fungerar inte riktigt som i C++ - men nästan. Du skapar helt enkelt inte en kopia, utan låter en variabel peka mot samma utrymme som en annan.

$a =& $b;

Bra när man vill hålla koll på minnesanvändningen.

function foo( &$bar ) {
     $bar .= " world!";
}
$foobar = "Hello";
echo $foo( $foobar );
// Ger: "Hello world!"
aasahMedlem sedan mars 20034 471 inlägg
#7

SPiN skrev:

Fungerar sämre, nja... Visst kopieras dom, men jag skulle inte vilja påstå att det gör det sämre. Snarare säkrare, eftersom att man har bättre koll på sina variabler och dess värden. ...

I mitt fall, relaterat ovan, vill jag uppdatera värdena i en befintlig vektor vars slutresultat är hela meningen med skriptet. I det läget anser jag att det är befogat att ha vektorn som global variabel. Dessutom om jag istället skrev:

function update($i, $v) {
      if (!even($i)) {
	$v["D"]++;
      $i--;
   }
   ...
}
update(3, $vect); //Tex

Så skulle $vect se exakt likadan ut efter update som före, eftersom update använder en kopia av $vect - åtminstone enligt php's dokumentation. Alltså finns bara två alternativ: Global variabel eller referenser. Och det senare vågade jag mig inte på än. Fortfarande är det så pass mycket som kan krångla pga jag är dåligt insatt att enkelhet i skripten har högsta prioritet för mig.

Rent generellt har du så klart rätt, dock. :)

PhorpherMedlem sedan feb. 20002 300 inlägg
#8

Du kan returnera vektorer i PHP. Kanske inte det bästa i ditt fall men det funkar. :)

130 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)