Statikus válozó használata

 

A statikus változó akkor is megtartja értékét, ha a függvényünk befejezte a műveletet.
A függvény újbóli meghívásakor, függvényünk azon static változó értékkel fog tovább dolgozni, melyet az előző lefutáskor a static változó felvett.

A statikus változó
- Miután a függvény befejezte feladatát, a benne használt változó megsemmisül, értéke pedig elvész.
- A változó és annak értéke továbbra is megmaradjon a két függvényhívás között, a static kulcsszót használjuk.
- Hasznos akkor is, ha megszeretnénk tudni, hogy az adott függvény hányszor futott le.

Példa
A függvényt 100 alkalommal hívjuk meg abból a célból, hogy minden alkalommal, egy-egy rekordot hívjon le egy adatbázisból.
A 100-ik alkalom után letiltjuk a rekordok lehívását.


function record_lekerdezese () {
static $szamlalo 0;
$szamlalo++;
// Ellenőrizzük számláló értéke 100 alatt van ($szamlalo < 100) akkor futtatjuk a programot.
// Ha a számláló értéke elérte vagy meghaladta a 100-at, ($szamlalo => 100) akkor: echo "Nem kell több rekord"
}

 

<?php

$i=15;

function hozzaad()
	{
	static $i;
	$i++;
	print("Függvényen belüli változó érték = $i<br />");
	}

print("Főprogramba lévő változó értéke = $i<br />");

hozzaad();

print("Főprogramba lévő változó értéke = $i<br />");

hozzaad();

?>
Eredmény a static változó esetén:

Főprogramba lévő változó értéke = 15
Függvényen belüli változó érték = 1
Főprogramba lévő változó értéke = 15
Függvényen belüli változó érték = 2

 

Mi történik, static változó nélkül?
PHP 5.4.xx-től kezdve jó és rossz eredményeket, valamint hibajelzéseket kapunk.
OKA: függvényben nincs meghatározva a $i kezdő értéke, azaz nem definiáltuk.
<?php

$i=15;

function hozzaad()
	{
	$i++;
	print("Függvényen belüli változó érték = $i<br />");
	}

print("Főprogramba lévő változó értéke = $i<br />");

hozzaad();

print("Főprogramba lévő változó értéke = $i<br />");

hozzaad();

?>
Eredmény a static változó nélkül:

Főprogramba lévő változó értéke = 15

Notice: Undefined variable: i in C:\Apache2.2\htdocs\xxxxx.php on line xx
Függvényen belüli változó érték = 1
Főprogramba lévő változó értéke = 15

Notice: Undefined variable: i in C:\Apache2.2\htdocs\xxxxx.php on line xx
Függvényen belüli változó érték = 1

Ha jól megfigyeljük, statikus változó nélkül, függvényünket akárhányszor is hívjuk meg, az eredmény mindig ugyan az lesz.

 


 

Statikus változó alkalmazásával, ugyan azon feladatot elvégeztethetjük függvényünkkel, mint a for ciklussal.
Statikus változó alkalmazásával:

<?php
function hozzaad()
	{
	static $i; 
	$i++ ;
	$eredmeny=3*$i;
	print("<br /> 3 * $i = ".$eredmeny);
	}

hozzaad();
hozzaad();
?>
Eredmény:


3 * 1 = 3
3 * 2 = 6
A for ciklussal:

<?php
for ($i=1; $i < 3; $i++)
	{
	$eredmeny=3*$i;
	print("<br /> 3 * $i = ". $eredmeny);
	}
?>
Eredmény:


3 * 1 = 3
3 * 2 = 6

 


Fenti példában látható feladathoz, a for ciklus választása praktikus.
A következő példához viszont a statikus változó és a függvényhívás választása praktikus.

 

Feladat:
Határozzuk meg, a következő méretek alapján, hány köbméteresek a víztározók:
"a" oldal hossza tetszőleges, de jelen esetben a következő értékekkel kell dolgozni: 10m, 15m, 24m, 42m
"b" oldal hossza 10m-es egységgel növekedjen, kezdő értéke: 10m
"c" oldal, azaz mélysége fix, azaz állandó 50 m

 

A feladatot elvégezzük statikus változó alkalmazásával, és for ciklussal.
Statikus változó alkalmazásával:

<?php
function terfogat($aoldal)
	{
	static $boldal=10;
	$fixoldal=50;
	print("Térfogat = ". $aoldal * $boldal * $fixoldal. "m<sup>3</sup><br />");
	$boldal=$boldal+10;
	}
// Következik a paraméterek átadása.
terfogat(10);   terfogat(15);   terfogat(24);   terfogat(42);
?>
Eredmény:

Térfogat 10 * 10 * 50 = 5000m3
Térfogat 15 * 20 * 50 = 15000m3
Térfogat 24 * 30 * 50 = 36000m3
Térfogat 42 * 40 * 50 = 84000m3
for ciklus alkalmazásával:

<?php
$boldal=10;
$fixoldal=50;
for ($aoldal=10; $aoldal < 43; $aoldal++) {
	if($aoldal==10){
	print("Térfogat = ". $aoldal * $boldal * $fixoldal. "m<sup>3</sup><br />");
	$boldal=$boldal+10;
	}
	if($aoldal==15){
	print("Térfogat = ". $aoldal * $boldal * $fixoldal. "m<sup>3</sup><br />");
	$boldal=$boldal+10;
	}
	if($aoldal==24){
	print("Térfogat = ". $aoldal * $boldal * $fixoldal. "m<sup>3</sup><br />");
	$boldal=$boldal+10;
	}
	if($aoldal==42){
	print("Térfogat = ". $aoldal * $boldal * $fixoldal. "m<sup>3</sup><br />");
	}		
	
}
?>
Eredmény:

Térfogat 10 * 10 * 50 = 5000m3
Térfogat 15 * 20 * 50 = 15000m3
Térfogat 24 * 30 * 50 = 36000m3
Térfogat 42 * 40 * 50 = 84000m3