sâmbătă, 26 martie 2011

PHP Variabile si referinte in functii (part14)

Variabile si referinte in functii

Variabilele functiilor in PHP sunt de doua tipuri principale:
Variabile globale
Variabile locale
Variabilele globale sunt create în exteriorul functiei, în timp ce variabilele locale sunt create în interiorul unei functii.
1. Utilizarea variabilelor globale
Asa cum s-a explicat anterior, variabilele globale sunt cele declarate în afara oricarei functii.
Totalitatea locurilor unde este accesibila o variabila se numeste "domeniu de existenta al variabilei". Variabilele globale nu pot fi accesibile din interiorul corpului unei functii; cu alte cuvinte, domeniul de existenta al unei variabile globale, nu include corpurile functiilor. Daca doriti sa obtineti accesul la o variabila globala în cadrul unei functii, puteti extinde domeniul de existenta al variabilei prin specificarea in functie a numelui variabilei, în cadrul unei instructiuni GLOBAL.
Instructiunea GLOBAL are urmatoarea forma:
GLOBAL variabila1, variabila2, variabila3;
Iata un exemplu concludent :
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
        return $var1 + $var2;
}
echo "Suma este ". Suma();
?>
- Functia "Suma()" foloseste variabilele $var1 si $var2 declarate anterior, dar aceste variabile nu au domeniu de valabilitate in interiorul functiei. Prin urmare rezultatul functiei este NULL.
Pentru a rezolva aceasta problema vom declara cele doua variabile ca fiind variabile globale, ca in exempul urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
        GLOBAL $var1, $var2;
        return $var1 + $var2;
}
echo "Suma este ". Suma();
?>
- In exemplul de mai sus declaratia: "GLOBAL $var1, $var2" face ca variabilele $var1 si $var2 sa fie recunoscute si in interiorul functiei.
- Puteti scrie si cu litere mici "global", dar e mai usor de recunoscut cu litere mari.

O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP predefinite $GLOBALS, dupa cum puteti vedea in exemplu urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
        return $GLOBALS['var1'] + $GLOBALS['var2'];
}
echo "Suma este ". Suma();
?>
$GLOBALS este o variabila predefinita, este de fapt un array ; elementele acestei matrice au cheia egala cu numele variabilelor declarate si valoarea egala cu cea a variabilelor declarate.
$GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script.
Puteti folosi oricare din cele doua variante prezentate: instrucrtiunea GLOBAL sau variabila $GLOBALS.
In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi :
Suma este 385
2. Utilizarea variabilelor locale
Variabilele locale sunt create in interiorul functiei si sunt distruse cand se încheie apelul la functia respectiva. În consecinta, variabilele locale sunt disponibile numai pe durata executiei functiei asociate.
Argumentele functiilor constituie un tip important de variabila locala. Cu toate acestea, puteti crea o variabila locala prin simpla atribuire a unei valori unei variabile din interiorul unei functii.
Pentru a ilustra deosebirea dintre variabilele locale si cele globale, iata un script care defineste o variabila locala denumita "$x" si o variabila globala cu acelasi nume:
<?php
function v_local() {
        $x = 5;
        echo "<br />In corpul functiei x = $x";
}
$x = 2;
echo "<br />In corpul scriptului x = $x";
v_local();
echo "<br />In corpul scriptului x = $x";
?>
Cand executati acest script, veti primi urmatoarele rezultate:
In corpul scriptului x = 2
In corpul functiei x = 5
In corpul scriptului x = 2
Remarcati diferenta dintre cele doua variabile $x, chiar daca numele variabilelor este acelasi.
Cand este apelata functia v_local(), $x ia valoarea 5, in rest, inainte si dupa, ia valoarea 2.
Domeniul de existenta al variabilei globale $x nu se extinde în interiorul corpului functiei v_local(), iar domeniul de existenta al variabilei locale $x nu se extinde dincolo de corpul functiei respective. Cu alte cuvinte, domeniile de existenta ale celor doua variabile sunt complet distincte.
3. Utilizarea variabilelor statice
Uneori este nevoie ca o variabila locala sa-si pastreze valoarea de la un apel al functie asociate la altul. Altfel spus, nu doriti ca variabila sa fie distrusa la încheierea apelului la functie.
Pentru acest lucru puteti folosi instructiunea STATIC (la fel cu "static").
Forma instructiunii STATIC este similara cu aceea a instructiunii GLOBAL.
STATIC $var1, $var2, $var3;
O variabila afisata într-o instructiune STATIC este cunoscuta sub numele de "variabila statica".
Iata un exemplu care prezinta modul de utilizare a unei variabile statice:
<?php
function v_local() {
        $x = $x + 1;
        echo "<br /> x = $x";
}
function v_static() {
        STATIC $x;
        $x = $x + 1;
        echo "<br /> x = $x";
}
v_local();
v_local();
v_local();

v_static();
v_static();
v_static();
?>
Daca rulati acest script, veti primi urmatoarele rezultate:
x = 1
x = 1
x = 1
x = 1
x = 2
x = 3
Observati ca variabila locala $x, definita în cadrul functiei v_local(), este creata din nou la fiecare apelare a functiei, în consecinta, valoarea sa este întotdeauna afisata ca fiind egala cu 1.
Prin contrast, variabila statica $x, definita în cadrul functiei v_static(), îsi pastreaza valoarea de la un apel al functiei la urmatorul; ca atare, valoarea sa creste de fiecare data când este executata functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce înseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu argumentele în sine. Ca o consecinta, o functie PHP nu poate modifica valorile argumentelor sale.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument, specificând ca argumentul sa fie transferat prin referinta.
Când un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu valoarea argumentului si are libertatea de a modifica acea valoare.
Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument în antetul functiei sau în apelul la functie.
Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
<?php
function p_valoare($a) {
        $a = 1;
}
function p_referinta(&$a) {
        $a = 1;
}

$b = 0;
p_valoare($b);
echo "<br /> \$b = $b";

$b = 0;
p_valoare(&$b);
echo "<br /> \$b = $b";

$b = 0;
p_referinta($b);
echo "<br /> \$b = $b";
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare functie preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca argumentul sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat prin valoare.
Primul paragraf al programului invoca functia "p_valoare()", transferând argumentul prin valoare. În consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar, foloseste un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. În consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 în 1.
Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este transferata prin referinta, în consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 în l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai dificil de înteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time pass-by-reference", p_valoare(&$b), a fost scoasa din uz. Dar poate fi activata din php.ini, daca aveti acces, prin setarea 'true' la "allow_call_time_pass_reference".

JavaScript - Obiectul imagine-1(Part20)

Obiectul image - 1
Folosind JavaScript puteti crea o multime de efecte imaginilor de pe site.

In aceasta lectie si in urmatoarea veti invata sa lucrati cu obiectul image, sa creati efecte cu ajutorul imaginilor, folosid JavaScript.

1. Imaginile in pagina web

In JavaScript toate imaginile sunt reprezentate intr-o matrice numita images. Aceasta este o proprietate (si subobiect) a obiectului "document".

Pentru indexarea in matrice (sau tablou), fiecare imagine de pe o pagina web are un anumit numar (index). Prima imagine are numarul 0, cea de-a doua imagine are numarul 1 si asa mai departe.

Astfel, se poate face referire la prima imagine folosind expresia "document.images[0]".

Fiecare imagine dintr-un document HTML este considarata un obiect Image.

Un obiect Image are mai multe proprietati care pot fi accesate prin JavaScript. De exemplu puteti vedea dimensiunile unei imagini folosind proprietatile "width" si "height".

Urmatorul exemplu returneaza lungimea (in pixeli) a primei imagini din document:

document.image[0].height

Declararea imaginii care apare in pagina web se face cu sintaxa HTML:

<img src="fisier.gif" name="nume_img" id="id_img" />

Daca sunt mai multe imagini pe o singura pagina, e mai dificil sa se lucreze cu ele folosind numarul indexului, de aceea se poate atribui fiecarei imagini cate un nume (cu atributul "name").

O alta metoda este folosirea proprietatii "getElementById("id_element"), unde "id_element" este id-ul imaginii dat cu atributul "id="..."", ca in exemplu urmator:

document.nume_img.height

sau

document.getElementById("id_img").height

Obiectul "image" are o singura metoda:

handleEvent() - reprezinta evenimentul specificat pentru executarea unei anumite actiunie

Proprietatile obiectului image sunt urmatoarele:

Border - poate fi doar citita si este latimea marginii din jurul imaginii specificata în pixeli

Alt - specifica textul care va fi afisat in locul imaginii(daca nu poate fi vizualizata de browser)

Align - unde sa fie plasata imaginea

Complete - poate fi doar citita si este o valoare booleana care permite sa stim daca imaginea a fost descarcata complet.

Height - inaltimea in pixeli a imaginii

Hspace - se refera la spatiul din dreapta si stanga imaginii (in pixeli)

Lowsrc - specifica un URL al unei imagini ce va fi afisata la o rezolutie scazuta

Name - se foloseste pentru a da nume unei imagini

Src - specifica URL-ul (adresa si numele) imaginii

usemap - eticheta map

Vspace - spatiul dintre partea de sus si de jos a imaginii

Width - latimea in pixeli a imaginii

2. Incarcarea unei imagini noi

Daca doriti sa schimbati imaginile pe pagina prin JavaScript, se foloseste propprietatea src.

Ca si in eticheta <img>, proprietatea "src" reprezinta adresa imaginii afisate.

Cu JavaScript putem da o noua adresa imaginiii care trebuie incarcate in pagina, astfel imaginea de la noua adresa va inlocui vechea imagine.

Iata un exemplu prin care puteti intelege cum se face aceasta schimbare de imagini:

<img name="imagine" src="img1.jpg" width="155" height="155">

<form>

  <input type="button" onClick="document.imagine.src='img2.jpg'" value="Schimba imaginea">

</form> - Imaginea "img1.jpg" este incarcata si ia numele "imagine".

- Cu linia de cod "document.imagine.src='img2.jpg' se inlocuieste fosta imagine "img1.jpg" cu o noua imagine "img2.jpg", prin apasarea butonului "Schimba imaginea".

- Imaginea noua va fi afisata in acelasi loc, suprafata de afisare a imaginii ramane aceeasi.

In pagina web exemplul acesta va afisa urmatorul rezultat:
Iata inca un exemplu in care avem o pagina HTML cu doua link-uri (legaturi) care, printr-un script JS schimba afisarea mai multor imagini in acelasi loc. Imaginile sunt declarate si stocate intr-o variabila tablou "imagini". Pentru schimbarea imaginilor se folosesc 2 functii: "gonext" si "goback".
<html>
<head>
<title>Titlu</title>
<script type="text/javascript">
<!--
imagini = new Array("img1.jpg","img2.jpg","img3.jpg");
nr = 0;
function goback() {
if (document.images && nr > 0) {
nr--;
document.imgs.src=imagini[nr];
}
}
function gonext() {
if (document.images && nr < (imagini.length - 1)) {
nr++;
document.imgs.src=imagini[nr];
}
}
// -->
</script>
</head>
<body>
<h4 align=center>Imagini<br>

<img src="img/img1.jpg" name="imgs" width="155" height="155"><br>
<a href="javascript:goback()"><<- Precedenta</a> |
<a href="javascript:gonext()">Urmatoarea ->></a>
</h4>
</body>
</html> Dupa ce aplicati acest cod intr-un document HTML veti avea in browser urmatorul rezultat:

- Un dezavantaj al scripturilor din aceste doua exemple poate fi faptul ca dupa apasarea butonului "Schimba imaginea" sau a link-ului "urmatoarea >>", afisearea imagini noi poate intarzia deoarece aceasta trebuie sa fie incarcata de browser dupa apasarea butonului (sau a link-ului). In lectia urmatoare veti invata cum sa evitati acest lucru prin "preincarcarea imaginilor".