webForumDet fria alternativet
Logga in / Bli medlem

Globala variabler

PHP

7 svar · 353 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Trådstart#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....

Medlem sedan mars 20032 667 inlägg
#2
global $vect;
Medlem sedan mars 20034 471 inlägg
#3

Tusen tack! :D

Medlem 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.

Medlem 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

Medlem 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!"
Medlem 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. :)

Medlem sedan feb. 20002 300 inlägg
#8

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

328 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
185 ms — ändringar (db)