Miért szokták ilyen sokat használni a változókat?
Pl van egy ilyen:
$valami = getTeszt();
És a $valami megvan hívva 2 helyen.
Olyankor nem érdemesebb inkább új változó helyett a getTeszt();-et írni a változó helyére?
Nem. A getTest egy függvény, egy visszatérési értékkel. A név alapján valami teszteredményt ad vissza.
Ha mindenhová beírod a getTeszt-et, minden alkalommal lefut a getTeszt, és az is lehet, hogy mindig más eredményt ad (például ha terheltségi teszt).
Viszont így egyszer lefuttatod, és az eredményét mented el a változóba, és azzal az egy eredménnyel dolgozol tovább
A többiek már elmondták, hogy mi az értelme. Viszont megpróbálnám laikusok számára is érthetően elmagyarázni.
Ez a getTeszt() csinál valamit, és ennek eredménye van. Olyan, mintha odamennék hozzád azzal, hogy:
- Mennyi 2974*1873?
Ezzel el fogsz szöszölni egy darabig, aztán rávágod, hogy 5570302. Melyik a gyorsabb? Leírom az eredményt egy lapra, és amikor kell, már nem kell újra kiszámoltatnom veled; vagy ha akárhányszor kell ez az eredmény, mindig kiszámoltatom veled?
tabaki: mármint a naplójában megnézi, hogy mit kell csinálni, hogy hol van leírva, hogy mit kell csinálni hogy megtudd, esik-e az eső. A naplóban látod, hogy a polcon az 5. sorban lévő 4. könyv 13. oldala. Ahol ezt írják:
Állj fel a székből, menj az ablakhoz, húzd fel a redőnyt, nézz ki, menj vissza.
Na melyik az egyszerűbb?:) Megmondani az utolsó állapotot vagy újra megnézni... persze az első esetben nem friss lesz az eredmény, lehet azóta már nem is esik.
Néhány triviális probléma:
Mondjuk a jelenlegi időpontból generálsz valamilyen azonosítót – mondjuk egy hibabejelentő oldalon egy ticket azonosítót –, amit egyrészt beírsz egy adatbázisba, másrészt kiteszed a kimenetre. (Most tekintsünk el attól, hogy ez nagyon rossz ötlet, mert ütközhet két ticket, ha ugyanabban a másodpercben generálták.)
function insert_ticket_to_database($timestamp, …) {
// Itt beírja az adatbázis megfelelő táblájába a létrehozott hibajegyet,
// ahol a $timestamp lesz a jegy egyedi azonosítója
}
insert_ticket_to_database(time() , …);
echo "A hibajegyed azonosítója: " . time();
Mi a probléma? Lehet, hogy a két time() hívás között pont ugrik eggyel a másodperc, így az más idő lesz beírva az adatbázisba és más idő lesz kiírva a kimenetre. A helyes megoldás:
$timestamp = time();
insert_ticket_to_database($timestamp, …);
echo "A hibajegyed azonosítója: " . $timestamp;
Így biztos, hogy az adatbázisba ugyanaz az időbélyeg kerül, mint ami a kimenetre.
~ ~ ~
A másik probléma:
Mondjuk van egy függvényed, ami visszaadja az első százezer prímszámot egy tömbben. (Ez sem a legjobb példa, de szemléltetésnek jó lesz.)
function getprimes() {
// Itt szépen lassan kiszámolja, hogy melyik az első tízezer prímszám.
}
if (!in_array($a, getprimes()) echo "Az első megadott szám nem prím!";
if (!in_array($b, getprimes()) echo "A második megadott szám nem prím!";
Mondjuk a getprimes függvény fut 10 másodpercig. Ha így csinálod, akkor mindkét feltétel ellenőrzésnél lefut, így összességében 20 másodpercig fut a kódod.
Megoldás:
$primes = getprimes();
if (!in_array($a, $primes) echo "Az első megadott szám nem prím!";
if (!in_array($b, $primes) echo "A második megadott szám nem prím!";
Így a getprimes függvény csak egyszer lesz meghívva, az eltart 10 másodpercig. A feltétel ellenőrzés már a kiszámolt tömböt használja, így annak kicsi az időigénye. Az ellenőrzés 20 másodperc helyett 10 másodperc alatt végrehajtódik.
~ ~ ~
for($i=0 ; $i < count($tomb) ; $i++) {
// …
}
Mi a probléma? Az, hogy a count minden egyes ciklusléptetésnél lefut. (Ami egyébként elég gyors, tehát legtöbbször nem akkora probléma.) Ha nagy a tömb és eléggé időkritikus a futás, akkor ezzel értékes időt vesztesz. Akkor már jobb így:
$db = count($tomb);
for($i=0; $i < $db; $i++) {
// …
}
~ ~ ~
Néha még ott is megfontolandó változókat használni, ahol amúgy az értéket egyszer használjuk, és futásidővel, memóriahasználattal is rosszabbul járunk, viszont cserébe áttekinthetőbb lesz a kód.
Pl.:
function write_to_log($userid, $date, $action, $ip, …);
write_to_log($_SESSION['user']['id'], date('Y-m-d H:i:s), isset($_GET['action'])?$_GET['action']:'no action', $_SERVER['HTTP_CLIENT_IP'], …);
Most ha 10 paramétere van a write_to_log függvénynek, akkor ez így „kissé” átláthatatlanná válik. Valamennyit segít, ha a híváskor minden paramétert külön sorba írsz, de ott is el lehet tévedni. Itt megfontolandó lehet egy ilyen megoldás is:
$userid = $_SESSION['user']['id'];
$date = date('Y-m-d H:i:s);
$action = isset($_GET['action'])?$_GET['action']:'no action';
$ip = $_SERVER['HTTP_CLIENT_IP'];
…
write_to_log($userid, $date, $action, $ip, …);
Így a write_to_log függvényhívását egyszerűen csak át kell másolni a függvény definíciójából. Biztosabb, hogy nem kevered össze a paraméterek sorrendjét, nem hagysz ki egy paramétert sem.
~ ~ ~
Olyan triviális esetekről ne is beszéljünk, ha mondjuk egy véletlen számot kell generálni, majd több helyen felhasználni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!