P2 29-36

PHP P2 – canalul youtube thenewboston – phpacademy – 200 vids Vid 29- 36

- 29 – Functiile die si exit

Ele intrerup executia programului si pot afisa un mesaj.

Sunt utile atunci cand se genereaza erori care opresc executia programului. In aceste cazuri e mai bine sa intrerupem noi executia programului cu un mesaj explicativ decat sa primim erori de la PHP.

Se luam un exemplu.

<?php
echo 'Hello';
echo ' World';
?>

In mod normal se afiseaza Hello World dar sa inseram o instructiune die() intre cele doua instructiuni echo;

<?php
echo 'Hello';
die();
echo ' World';
?>

Va afisa doar ‘Hello’ pentru ca programul se termina imediat ce intampina instructiunea die()

Se poate folosi cu acelasi rezultat si exit();

Sau se poate folosi die() cu un mesaj de eroare.

 <?php
echo 'Hello <br>';
die( 'Eroare, executarea scriptului a fost intrerupta');
echo ' World';
?>
Va afisa :
Hello
Eroare, executarea scriptului a fost intrerupta

Dar de ce am dori sa terminam script-ul in mijlocul executiei acestuia?

Un exemplu bun e conectarea la o baza de date. Comanda pentru conectarea la serverul local mysql este mysql_connect(”,”,”) avand trei argumente: localhost (numele serverului local), numele utilizatorului si parola

 <?php
mysql_connect('localhost','root','');
?>

Numele serverului este ‘localhost’, username ‘root’ si parola este ‘ ‘ (adica fara parola)

In acest caz nu va da eroare pentru ca astea sunt informatiile implicite din instalarea unui WAMP.

Sa completam scriptul cu instructiunea die

<?php
mysql_connect('localhost','root','') or 
die(Nu s-a reusit conectarea la server);
echo 'Ne-am conectat la server';
?>
Va afisa 'Ne-am conectat la server'

Sa modificam parametrii astfel incat sa cream o eroare. De exemplu sa oferim un username care nu exista, in loc de root vom folosi alex:

 <?php
mysql_connect('localhost','alex','') or 
die('Nu s-a reusit conectarea la server');
echo 'Ne-am conectat la server';
?>
Va afisa un avertisment sau o eroare dar si mesajul 'Nu s-a reusit conectarea la server'

Se observa ca se foloseste operatorul logic “or”. E o modalitate succinta de a alege sa se execute prima varianta adevarata. In acest caz daca mysql_connect da eroare (returneaza false), PHP alege sa execute ce urmeaza dupa “or” astfel incat evaluarea expresiei sa fie completa. Cum die() returneaza intotdeauna valoare true, acesta se va executa in caz ca mysql_connect returneaza false.

O varianta mai usor de inteles din punct de vedere logic ar putea fi folosind if

 <?php
if(mysql_connect('localhost','alex','')) {
echo 'Ne-am conectat la server';}
else {
die('Nu s-a reusit conectarea la server');}
?>

E clar ca e mai mult de scris decat cu prima modalitate

Pe langa mesajul ‘Nu s-a reusit conectarea’ pot fi afisate si alte erori pe care nu le dorim.

Daca nu dorim sa se afiseze mesajele de avertisment atunci apelam la setarile de afisare a erorilor (cap -14-) sau mai simplu inseram un simbol “@” in fata instructiunii mysql_connect.

<?php
@mysql_connect('localhost','alex','') or die(Nu s-a reusit conectarea la server);
echo 'Ne-am conectat la server';
?>
Se va afisa doar mesajul 'Nu s-a reusit conectarea la server'.

- 30 – Functii, elemente de baza

O functie este un bloc de cod caruia ii dam un nume si pe care il putem reutiliza oricand dorim noi. Este mai usor sa executam un bloc intreg de cod doar apeland numele lui decat sa copiem intregul bloc de cod in programul nostru. In plus functia poate fi apelata de nenumarate ori prin numele pe care l-am dat noi.

O functie se declara in urmatorul mod

 function nume_functie (lista de argumente)
{
bloc de instructiuni
}

E important sa denumim functiile astfel incat numele sa sugereze ce face functia.

De ex sa afisam numele lui Alex.

<?php
function afis_nume(){
echo 'Alex';}

echo "Numele lui este<br>";
afis_nume();
 ?>
Va afisa: 
Numele lui este
Alex

In acest caz nu este o functie utila, dar de cele mai multe ori functiile vor fi mai complexe si vor imparti programul in segmente de cod care vor fi mai usor de analizat.

- 30 – Functii cu argumente

Sa presupunem ca avem de adunat doua numere. Si trebuie sa face lucrul asta de mai multe ori in programul nostru.

Sa cream functia add() care va aduna doua numere

In interiorul parantezelor vor fi specificati parametrii, si anume variabilele care vor fi adunate.

add($number1, $number2)

<?php
function add($number1, $number2){
echo $number1 + $number2;
}
?>

Se observa ca nici in cazul parametrilor din cadrul functiilor nu trebuie specificat tipul de date al acestora. Tipul de date are importanta doar in momentul in care prelucram valorile din parametri.

Functiile trebuie apelate cu acelasi numar de parametri care apare si la declararea lor.

Daca incercam sa apelam functia add() fara nici un parametru vom avea cate un warning pentru fiecare parametru pe care am omis sa-l inseram – “lipseste argumentul cu numarul 1″ si “lipseste argumentul cu numarul 2″.

Sa folosim doua numere pentru adunare

$i_number1 si $i_number2

Am folosit in denumirea variabilei $i_number litera i pentru a desemna ca este o variabila input, adica va fi data ca valoare de intrare pentru functia add().

<?php
 $i_number=10;
$i_number=5;
function add($number1, $number2)
{
echo $number1 + $number2;
}
add($i_number1,$i_number2);
?>
Va afisa 15

In loc de $i_number1 si $i_number2 putem pune ce dorim noi, orice alte variabile sau valori intregi sau cu virgula, nu are importanta.

Care este mecanismul? Variabilele $i_number1 si $i_number2 primesc valori iar in momentul in care sunt folosite in apelul functiei acele valori sunt trimise codului din interiorul functiei. Functia proceseaza informatia din parametrii primiti si in final returneaza la randul ei o valoare sau afiseaza un rezultat.

Sa luam un alt exemplu in care se folosesc valori de intrare de diferite tipuri. Sa cream o functie care primeste ca parametrii elementele unei date calendaristice, le combina si apoi le afiseaza.

 <?php
function afis_data($zi, $luna, $an)
{
echo $zi. ' ' . $luna . ' ' . $an;
}
afis_data(31, 'martie', 2011);
?>
 Va afisa 31 martie 2011

Astfel pot fi trimise functiei parametri de tipuri diferite

 

- 32 – Functii care returneaza valori

De cele mai multe ori nu vom dori sa afisam informatiile prelucrate de functii. Mai curand ne intereseaza sa prelucram variabilele de intrare si apoi sa returnam rezultatul in codul de unde a fost apelata functia iar acolo vom folosi acel rezultat in alte calcule. Rezultatul returnat de o functie poate fi de orice tip, numar, sir de caractere etc.

Sa presupunem ca avem o expresie de forma (10 + 10) / (5 + 5) rezultatul este 2. Dar dorim ca adunarea sa fie realizata de o functie add() iar impartirea de o functie div().

Sa cream functia add().

<?php
function add($number1, $number2){
$result = $number1+$number2;
echo $result;
}
?>

Daca apelam aceasta functie din program, add(10,10) vom afisa rezultatul adunarii, 20. Dar nu folosim mai departe acest rezultat si nu-l stocam nicaieri ci doar il afisam. Pe noi insa ne intereseaza sa preluam acel rezultat si sa-l folosim ulterior.

De aceea vom folosi in finalul functiei instructiunea return $result. Astfel transmitem blocului de cod de unde a fost apelata functia valoarea calculata de aceasta.

<?php
function add($number1, $number2){
$result = $number1+$number2;
return $result;
}
 add(10,10);
}

Daca din program apelam add(10,10) atunci $number1 devine 10 iar $number2 ia valoarea celui de al doilea parametru 10. Variabila $result devine 20 prin insumarea celor doi parametri si apoi este returnata prin return $result. Astfel add(10,10) este evaluata de PHP ca avand valoarea 20 ca si cand am fi avut expresia 10 +10.

Ca sa putem vedea valoarea returnata de functie trebuie sa afisam rezultatul functiei:

echo add(10,10);

ca si cand add(10,10) ar fi tratata ca o variabila de sine statatoare pentru ca in acest moment add(10,10) contine valoarea 20

Putem crea o expresie complexa in care sa folosim apelul functiei:

echo add(10,10) + 100;

va afisa 120;

 

Sa revenim la exemplul de la inceput in care aveam expresia (10 + 10) / (5 + 5)

Avem deja o functie care sa calculeze sumele 10 + 10 si 5 + 5 dar ne mai trebuie o functie care sa realizeze impartirea

 function div($number1, $number2){
$rezult = $number1 / $number2;
return $result;
}

Se observa ca am folosit aceleasi denumiri de parametri si pentru functia div , $number1 si $number2. Asta pentru ca parametrii folositi in declarea unei functii nu sunt propriu-zis variabile declarate si care contin informatii. Ei exista doar pentru a specifica ce fel de valori va primi functia in momentul apelarii ei de aceea mai poarta denumirea de parametri formali. Astfel putem sa ii folosim cu aceleasi nume in oricate functii dorim. Ei exista doar in interiorul functiilor si doar in momentul apelului acestora.

Sa revenim la exemplu si vom folosi o variabila $sum pentru a stoca rezultatul final.

<?php
$sum=div ( add(10,10), add(5,5) );
echo $sum;
?>

Va afisa 2

 

- 33 – Variabile globale

Se poate intalni urmatoarea situatie: se definesc cateva variabile in afara unei functii dar cand incercam sa folosim acele variabile in interiorul functiei nu le putem accesa.

Sa luam un exemplu in care sa folosim o variabila declarata in programul principal si care sa stocheze o informatie, sa spunem adresa unui user care acceseaza pagina PHP la un moment dat.

 <?php
$user_ip = $_SERVER['REMOTE_ADDR'];
echo $user_ip;
?>

Se afiseaza 127.0.0.1. Variabila $user_ip a fost definita in programul principal si tot acolo este afisata si contine IP-ul unui utilizator care acceseaza pagina PHP.

Pentru ca in faza de dezvoltare a aplicatiilor lucram de obicei pe serverul local, localhost, IP-ul este cel local, 127.0.0.1

Vom crea o functie echo_ip() in care se va incerca folosirea variabilei $user_ip.

<?php
$user_ip = $_SERVER['REMOTE_ADDR'];
 function echo_ip(){
    $sir='Adresa ta este'. $user_ip. '<br>';
    echo $sir;}
echo_ip();
?>
De aceasta data se afiseaza doar sirul "Adresa ta este"

fara sa mai adauge si IP-ul 127.0.0.1 pentru ca variabila $user_ip nu mai este recunoscuta in interiorul functiei echo_ip().

Pentru a determina PHP-ul sa recunoasca variabila $user_ip in interiorul functiei vom adauga chiar la inceputul functiei linia de cod

global $user_ip;

specificand in acest mod ca variabila $user_ip este globala prin urmare vizibila atat in functie cat si in programul principal.

<?php
$user_ip = $_SERVER['REMOTE_ADDR'];
function echo_ip()
{
global $user_ip;
$sir='Adresa ta este'. $user_ip. '<br>';
echo $sir;
}
echo_ip();
?>

De aceasta data variabila $user_ip este vizibila in interiorul functiei echo_ip() si continutul ei va fi afisat odata cu sirul ‘Adresa ta este’.

Adresa ta este 127.0.0.1

Un motiv important pentru utilizarea variabilelor globale este faptul ca unele variabile folosite in programele noastre vor fi create in alte fisiere. Acele fisiere pot fi incluse in fisierul in care lucram. Prin urmare, ca sa putem folosi acele variabile externe in functiile noastre, va trebui sa le declaram globale in functiile in care dorim sa le folosim.

 

- 34 – Functii pentru siruri de caractere

Sa luam o variabila $string = ‘This is an example string';

Vom folosi functia str_word_count(). Poate fi folosita atat pentru a numara cate cuvinte se afla intr-un sir de caractere cat si pentru a produce un vector ce contine cuvintele din sirul de caractere dat ca parametru.

str_word_count($string, 0)  sau str_word_count($string) returneaza numarul de cuvinte din $string

str_word_count($string,1) va returna un vector (array) care va contine cuvintele din $string iar indicele unui element va indica pe ce pozitie in sir se afla cuvantul continut de element.

str_word_count($string,2) va returna un vector asociativ in care elementele vor contine fiecare cuvant iar fiecare element va avea indicele egal cu pozitia la care se afla cuvantul in sir (pozitia din punct de vedere al caracterelor nu al cuvintelor)

 

1. Mai intai varianta in care str_word_count($string) returneaza numarul de cuvinte

<?php
$string = 'This is an example string';
$string_word_count= str_word_count($string);
echo $string_word_count;
?>
Va afisa valoarea 5 pentru ca sirul 'This is an example string' contine 5 cuvinte

 

2. Varianta in care str_word_count() returneaza un vector ce contine cuvintele din sir

<?php
$string = 'This is an example string';
$string_word_count= str_word_count($string,1);
echo $string_word_count;
?>
Va afisa array

Asta inseamna ca $string_word_count a primit ca valoare un vector dar nu putem sa-l afisam cu echo, insa echo afiseaza ca are de a face cu un vector.

Pentru a afisa un vector va trebui sa folosim o functie pentru afisat vectori, print_r();

<?php
$string = 'This is an example string';
$string_word_count= str_word_count($string,1);
print_r ($string_word_count);
?>
Va afisa array([0]=> This [1] => is [2] => an [3] => example [4] => string) 

care reprezinta vectorul format din impartirea in cuvinte separate a sirului $string. Se observa ca indicele de la 0 la 4 reprezinta al catalea e respectivul cuvant in sirul $string. In cazul nostru cuvantul “example” este pe pozitia a 4-a si in vector elementul corespunzator are indicele 3.

array([0]=> This [1] => is [2] => an [3] => example [4] => string)

 

3. Varianta in care str_word_count() returneaza un vector asociativ in care fiecare element contine cate un cuvant din sir iar indicele indica pozitia din punct de vedere al caracterelor in sir. Exemplu: daca $string = ‘This is an example string’ atunci vectorul asociativ este

array([0]=> This [5] => is [8] => an [11] => example [19] => string)

deoarece cuvantul “This” incepe la pozitia 0, cuvantul “is” la pozitia 5 si tot asa. Sirul $string incepe la pozitia 0 si se termina la pozitia 24 pentru ca este format din 25 de caractere.

<?php
$string = 'This is an example string';
$string_word_count= str_word_count($string,2);
print_r ($string_word_count);
?>
Va afisa
array([0]=> This [5] => is [8] => an [11] => example [19] => string)

 

Functia str_word_count poate fi folosita si cu un al treilea parametru care permite ca anumite semne de punctuatie sa fie considerate cuvinte de sine statatoare. De exemplu daca am adauga caracterul punct “.” la sfarsitul sirului

$string =’This is an example string .’

si am aplica functia $str_word_count($string,1),  PHP nu va lua in considerare ca exista caracterul punct separat cu un spatiu de ultimul cuvant din sir.

Insa daca aplicam str_word_count($string,1,’.’) si apoi afisam rezultatul vom avea

array ( [0] => This [1] => is [2] => an [3] => example [4] => array [5] => . )

ceea ce inseamna ca pe pozitia 5 a aparut un cuvant care este chiar “.” specificat de parametrul al treilea.

<?php
$string = 'This is an example string .';
$string_word_count= str_word_count($string,1,'.');
print_r ($string_word_count);
?>
Va afisa
array ( [0] => This [1] => is [2] => an [3] => example [4] => array [5] => . )

 

Daca insa $string =’This is an example string.’ are semnul de punctuatie punct “.” lipit de ultimul cuvant “string” atunci vom avea:

 <?php
$string = 'This is an example string.';
$string_word_count= str_word_count($string,1,'.');
print_r ($string_word_count);
?>
Va afisa
array ( [0] => This [1] => is [2] => an [3] => example [4] => string. )

ultimul cuvant, al cincilea, corespunzator indicelui 4 fiind “string.” , punctul “.” fiind luat impreuna cu cuvantul “string”.

Pot fi puse oricate caractere care pot fi interpretata drept cuvinte care in conditii normale ar fi ignorate.

De exemplu putem avea

<?php
$string='This is an example string & this is a tutorial .';
$string_word_count = str_word_count($string,1, '&.!') ;
print_r($string_word_count);
?>
Se afiseaza
array ( [0] => This [1] => is [2] => an [3] => example [4] => string [5] => & [6] => this [7] => is [8] => a [9] => tutorial [10] => . )

Se observa ca elementele 5 si 10 sunt chiar caracterele “&” si “.” indicate drept cuvinte in sirul ‘&.!’.

 

- 35 – Functii pentru siruri , continuare

Functia str_shuffle() – amesteca intre ele caracterele unui sir

<?php
$string = "This is an example string";
$string_shuffled= str_shuffle($string);
echo $string_shuffled;
?>

Afiseaza textul

T ieshpitm esxsgaila rnn

care este o amestecare aleatorie a caracterelor din sirul “This is an example string”

La ce ne poate folosi o astfel de functie? Atunci cand ne dorim sa upload-am un fisier si dorim sa-i dam un nume generat aleatoriu, putem amesteca un sir dupa care sa atasam o extensie.

Sau putem genera aleatoriu un numar foarte mare sau un text avand la baza doar anumite caractere. In general generarea aleatorie este utila in testarea programelor.

Sa  generam aleatoriu un sir care sa contina literele alfabetului si cifrele de la 0 la 9.

<?php
$string = "abcdefghijklmnop0123456789";
$string_shuffled= str_shuffle($string);
echo $string_shuffled;
?>
Va afisa
349bofn1idge7kc5j60ma8hlp2

Dar da dorim sa avem un sir de doar 5 caractere din sirul $string_shuffled?

Vom folosi functia substr($string_shuffled,0,5) in care am specificat ca extragem din sirul $string_shuffled 5 caractere pornind de la pozitia 0.

<?php
$string = "abcdefghijklmnop0123456789";
$string_shuffled = str_shuffle($string);
$half=substr($string_shuffled, 0, 5);)
echo $half;
?>
Va afisa
349bo

Daca ne dorim sa generam un sir format doar din jumatate din caractere fom folosi functia strlen($string) care returneaza lungimea sirului $string. Dupa aceea vom imparti lungimea la 2 pentru a obtine jumatate din lungimea sirului.

<?php
$string = "abcdefghijklmnop0123456789";
$string_shuffled = str_shuffle($string);
$half=substr($string_shuffled, 0, strlen($string)/2);)
echo $half;
?>
Va afisa
349bofn1idge7

care este un sir generat aleatoriu din toate caracterele sirului original dar avand lungimea de doar jumatate

 

Functia strrev() returneaza inversul unui sir

<?php
$string = "This is an example string";
$string_reversed= strrev($string);
echo $string_reversed;
?>
Va afisa
gnirts elpmaxe na si sihT

inversul sirului This is an example string

 

-36 – Functii pentru siruri de caractere , continuare

Functia similar_text()

Daca va doriti sa vedeti daca doua referate sunt diferite si nu unul inspirat din celalalt atunci se poate afla cu functia similar_text() cat de apropiate sunt cele doua texte unul fata de celalalt.

<?php
$string1 = 'This is an essay. I'm going to be talking about php.';
$string2 = 'This is an essay. I will be talking about the subject php.';
similar_text($string1, $string2, $result);
echo 'The similarity between is, ', $result;
?>
Va afisa
The similarity between is, 78.1818181818

Asta inseamna ca cele doua texte sunt asemanatoare in procent de aproximativ 78%.

Daca modificam si mai mult unul din texte astfel incat sa nu mai fie atat de asemanator de ex

<?php
$string1 = 'This is an essay. I'm going to be talking about php.';
$string2 = 'My essay is about php. I'm going to be talking about everything to do with php';
similar_text($string1, $string2, $result);
echo 'The similarity between is, ', $result;
?>
Va afisa
The similarity between is, 63.0769230769

Asemanarea a scazut textele fiind diferite intr-un procent mai mare.

 

Functia strlen() returneaza lungimea unui sir de caractere

<?php
$string = 'This is an example string';
$string_length = strlen($string);
echo $string_length;
?>
afiseaza 25, cat este dimensiunea sirului $string

Este utila si o vom folosi de multe ori cand vom dori sa verificam daca un sir nu este vid. De exemplu daca a fost introdusa o valoare intr-o caseta text dintr-un formular.

<?php
$string = 'This is an example string';
$string_length = strlen($string);
if( $string_length > 0){
echo $string;
}
else{
echo 'Eroare, introduceti macar un caracter';
}
?>

 

– 37 – Functii pentru siruri de caractere, continuare

Functia trim(), sterge spatiile din stanga si din dreapta unui sir

<?php
$string = ' This is an example string.  ';
$string_trimmed = trim($string);
echo $string_trimmed;
?>
Va afisa sirul "This is an example string."

care este cea mai mare parte din sirul $string mai putin spatiile de la inceput si de la sfarsit

La ce poate folosi functia trim()? Sa spunem ca dorim sa impartim un sir de caractere in elemente ale unui vector, dupa cum se va vedea la functia explode() – asemanatoare cu str_word_count($string,1). Insa in loc de siruri de caractere fara spatii vom avea si acele spatii de la inceput si de la sfarsitul textului. De cele mai multe ori nu ne dorim sa intalnim doar spatii in sirurile de caractere asa ca o metoda e sa ne asiguram ca le stergem din sirul original.

Daca se doreste eliminarea doar a spatiilor din stanga se foloseste functia ltrim() iar pentru spatiile din dreapta rtrim().

 

Functia addslashes(), adauga slash-uri in fata caracterelor care pot cauza probleme, de exemplu face escape pentru ghilimele

<?php
$string = 'This is a <img src="image.jpg"> string.';
$string_slashes = htmlentities(addslashes($string));
echo $string_slashes;
?>
Va afisa This is a <img src=\"image.jpg\"> string.

Am folosit si functia htmlentities() ca sa putem afisa si tag-urile html, altfel ar fi intrerpretate de browser si afisate ca elemente HTML. De exemplu aici ar fi incercat sa afiseze o imagine cu sursa src=”image.jpg”.

Se obserca ca functia addslashes() adauga caractere “” pentru a “scapa” caracterele care creaza probleme, in cazu nostru ghilimelele.

Nu mai trebuie sa avem noi grija sa introducem slash-uri in fata ghilimelelor sau apostroafelor sau altor caractere escape, mai ales ca nu stim ce poate introduce un utilizator intr-un formular. Cu functia addslashes() vom putea sa ne asiguram ca nu vor fi caractere care sa creeze probleme.

Daca ne dorim sa scapam de caracterele slash pe care fie le-am introdus noi, fie exista deja, putem folosi functia stripslashes();

<?php
$string = 'This is a <img src="image.jpg"> string.';
$string_slashes = htmlentities(addslashes($string));
echo stripslashes($string_slashes);
?>
Va afisa
This is a <img src="image.jpg"> string.

In general daca dorim sa trimitem in HTML vom folosi addslashes() dar daca dorim sa stocam intr-o baza de date doar informatia sau daca vom avea nevoie sa procesam sirurile in diverse moduri iar slash-urile ne-ar incurca, atunci vom scapa de caractere slash inutile cu functia stripslashes().

Aceste functii siruri de caractere din capitolele 34 – 37 reprezinta o colectie de functii mai des utilizate, insa sunt cu mult mai multe ce pot fi consultate pe http://php.net/manual/en/ref.strings.php