Programarea Core PHP Instalarea şi pregătirea pentru lucru În această lecţie, vom învăţa cum să setăm mediul de dezvoltare şi ce ne trebuie ca să lucrăm cu PHP. PHP este un limbaj de programare de scripting cu scop general. Iniţial, a fost proiectat ca limbaj pentru crearea paginilor web dinamice. Face posibilă procesarea şi încărcarea rapidă a paginilor, este simplu de înţeles şi de utilizat şi se execută pe aproape toate sistemele de operare. PHP este procesat de către serverul web şi generează codul HTML sau o altă ieşire pe care clienţii (care sunt cel mai des browsere web) pot să o recunoască şi să o interpreteze. Ca să puteţi să creaţi pagini web interactive şi să executaţi programele PHP, este necesar să aveţi acces la un server care suportă PHP. Însă, este lipsit de pragmatism ca, atunci când creaţi un site web interactiv cu ajutorul PHP-ului, să trimiteţi pagina PHP la un server de la distanţă de fiecare dată când doriţi să o testaţi. De aceea, se recomandă instalarea PHP pe plan local, pe propriul calculator. Unele sisteme de operare, precum Linux şi multe versiuni Unix, sunt livrate acum cu PHP deja instalat. La alte sisteme de operare, precum Windows sau Mac OSX, trebuie să instalaţi singuri. Aşadar, PHP este un limbaj de scripting al cărui scop primar, dar nu şi singurul (fiind vorba de un limbaj de scripting cu scop general), este procesarea datelor pe serverul web şi implementarea lor în codul HTML. Este vorba de un derivat direct al limbajului C şi o mare parte a sintaxei acestuia este identică cu acest limbaj de programare. Este gratuit şi aplicarea lui în HTML este foarte simplă. Pentru determinarea funcţionalităţii PHP, trebuie să fie indeplinite câteva condiţii:
Instalarea lui PHP pe calculatorul pe care vrem să se efectueze Scripturile PHP se interpretează, ceea ce înseamnă că nu sunt activate în mod direct, ci printr-un program de interpretare. Dacă pachetul PHP este instalat pe calculator, această componentă va fi disponibilă; Instalarea unui server web pe calculatorul pe care dorim ca acest limbaj să se efectueze De fapt, PHP nu necesită un server web pentru executarea sa, ci doar un interpreter. Dar, fiindcă vom vorbi de PHP în contextul web, este necesar şi un server web; Instalarea bazei de date pe calculatorul pe care vrem să se efectueze acest limbaj De asemenea, aceasta nu este o componentă necesară, dar, fiindcă PHP este o punte de legătură dintre paginile web şi date, se recomandă instalarea unei baze de date; Alegerea instrumentelor de codare a lui PHP Codul-sursă PHP se poate scrie în cele mai elementare instrumente de procesare a textului (de ex. Notepad). Însă, se recomandă utilizarea unui instrument care recunoaşte (şi marchează) comenzile PHP. Este posibil (şi de preferat) să utilizăm în acest scop unul dintre programele de producere a paginilor HTML (Adobe Dreamweaver, NetBeans,
Eclipse, Notepad++, SublimeText), care conţine şi partea de design. În acest curs, vom utiliza Notepad++.
Instalarea lui PHP Există mai multe moduri de instalare a lui PHP pe sistemul de operare (SO). Dacă este vorba de Linux, instalarea se face în timpul sau după instalarea sistemului de operare, prin asocierea serviciilor potrivite din distribuţia SO. Când este vorba de sistemele de operare Microsoft Windows, instalarea se poate face în două moduri: manual, componentă cu componentă, sau prin instalarea unui pachet care conţine întregul sistem. Aceste pachete sunt extraordinar de practice şi ne vom axa pe unul dintre acestea - WampServer. Cu ajutorul său, vom acoperi toate cele trei condiţii menţionate mai sus (PHP, serverul web şi baza de date). Pentru cerinţele acestui curs, puteţi să descărcați şi să instalaţi WampServer de pe internet: (http://www.wampserver.com/en/).
Instalarea instrumentelor de codare Pentru nevoile cursului, puteţi să descărcaţi şi să instalaţi instrumentul Notepad++ de la următorul link: (http://notepad-plus-plus.org/). După setarea corectă a tuturor serviciilor şi după pregătirea instrumentelor, utilizarea sistemului şi producţia aplicaţiilor PHP pot începe. Totuşi, pentru a ne uşura munca, trebuie să cunoaştem principiile de bază a funcţionării unui astfel de sistem. Mai întâi, trebuie menţionat că regulile de mai sus nu sunt atât de stricte, aşa cum poate par la prima vedere. De exemplu, chiar dacă nu dispunem de un interpreter PHP pe calculatorul nostru, aceasta nu înseamnă că nu putem să creăm codul, iar apoi să-l activăm pe un alt calculator. De asemenea, serverul/baza de date MySQL nu trebuie neapărat să fie pe acelaşi calculator pe care se află şi serverul web. Acesta nu trebuie să se afle pe un singur calculator şi nu este necesar să fie exact serverul web Apache (PHP poate fi efectuat şi pe serverul web MS IIS). Cu alte cuvinte, există diferite variante care se pot implementa în funcţie de necesităţile întregului sistem, dar care sunt, de asemenea, irelevante în momentul studierii bazelor limbajului de programare. De aceea, pentru familiarizarea noastră cu limbajul, vom utiliza procedura liniară, deşi aceasta poate nu va produce cele mai eficiente rezultate sau nu va reda imaginea perfect în oglindă a unui sistem real. Ceea ce este important este să producem în mediul de lucru condiţii cât mai apropiate de mediul de executare, pentru a facilita cât mai mult implementarea.
Coordonarea lui PHP cu serverul web Rolul fiecărui server web se reduce, mai mult sau mai puţin, la o singură funcţie, aceasta fiind acceptarea unei cereri trimise de utilizator prin internet, procesarea acesteia (care presupune găsirea documentului conţinut în această cerere) şi trimiterea răspunsului către utilizator. Dacă cererea de utilizator conţine numele şi tipul documentului care există pe serverul web într-o formă statică, serverul web va prelua documentul din sistemul de fişiere şi-l va livra utilizatorului prin intermediul internetului. Totuşi, dacă cererea nu se referă la un document existent, ci este cerut un conţinut care va fi generat în mod dinamic, serverul web trebuie să creeze răspunsul prin pornirea scriptului conţinut de cerere şi să implementeze rezultatul în documentul în care se află scriptul, după care să-l expedieze către utilizator. În final, deoarece scriptul/programul este implementat într-un document, utilizatorul va primi rezultatul sub forma unui document HTML valid. Pentru acest proces, serverul web şi clientul (când spunem client, ne referim la un browser precum Internet Explorer, Firefox, Chrome etc.) utilizează acelaşi limbaj - protocol de comunicare. Limbajul se numeşte HTTP (HyperText Transfer Protocol) şi este modul principal de comunicare între calculatoare pe internet. Atunci, care este rolul lui PHP? Rolul lui PHP este să traducă şi să pornească scriptul menţionat, dar şi să expedieze rezultatul obţinut către client. Trebuie să se ştie că PHP nu este singurul limbaj care poate să facă acest lucru. Există şi alte limbaje care se descurcă destul de bine cu această operaţiune (C#, VB, Java etc.), cu condiţia ca serverul să ştie despre care dintre ele este vorba şi când trebuie să activeze şi unde să găsească interpreterii pentru acestea. Dacă am vrea ca ceea ce am scris în paragraful precedent să fie prezentat sub forma unei ilustraţii, aceasta ar arăta în felul următor:
1.1 - Ilustrarea transportului de date
Imaginea de mai sus arată deplasarea datelor de la client până la server. Mai întâi, clientul generează cererea şi o împachetează în forma unei cereri HTTP, după care o expediază (1). Deşi cererea poate avea diferite caracteristici, la bază aceasta are următorul conţinut (2): GET /index.html HTTP/1.1 Host: www.some_site.com Când cererea ajunge la server, acesta observă modul în care o va trata. Vedem că pe primul rând al cererii este scris index.html. Aceasta este denumirea documentului pe care clientul îl solicită de la server. Având în vedere că documentul are extensia html, serverul concluzionează că nu trebuie să activeze codul de server, ci doar să transmită documentul înapoi la client, deoarece HTML este limbajul pe care clientul îl înţelege în totalitate (3a). Dacă documentul ar avea extensia .php, serverul ar angaja interpreterul php şi îi va trimite documentul (3b). Interpreterul php va traduce şi va executa documentul (respectiv, codul php care se află în el), apoi va crea răspunsul HTTP (4) şi îl va trimite clientului. O astfel de interpretare trebuie neapărat executată pe server, deoarece clientul (browserul web) nu înţelege limbajul PHP şi, dacă acesta ar ajunge la el, pe pagină s-ar afişa un simplu text, fiindcă clientul nu va fi capabil să-l interpreteze. Răspunsul HTTP nu diferă mult de cererea HTTP. Aici, serverul descrie documentul pe care îl trimite clientului. O parte a răspunsului arată cam aşa (4): HTTP/1.1 200 OK Connection: close Content-Type: text/html; charset=UTF-8 În a doua parte a răspunsului, se află documentul în sine. După obţinerea răspunsului, browserul îl analizează, apoi preia documentul, traduce conţinutul HTML în forma înţeleasă de utilizator şi îl reprezintă pe pagină.
Identificarea limbajului de scripting Pentru ca serverul web să recunoască cererea utilizatorului pentru executarea unui script, trebuie îndeplinită cel puţin o condiţie. Această condiţie este ca documentul să aibă extensia potrivită. În cazul lui PHP, această extensie este .php. Dacă ar fi fost vorba de un alt limbaj, extensia ar fi fost diferită (de ex. C#, VB, J# - .aspx sau .asp, Java - .jsp etc.). O altă condiţie este ca acest document să conţină un script. Aceasta nu este o condiţie propriuzisă de expediere a documentului către utilizator, deoarece chiar dacă nu conţine un script, conţinutul său va fi expediat. Pur şi simplu, serverul web va porni PHP (interpreterul), care va trece prin document, dar având în vedere că acest document nu conţine un script, nu va fi activat nimic, iar documentul va fi expediat către client în forma sa iniţială. Dar, dacă vrem (şi vrem) ca un script să se execute în documentul nostru, trebuie să înştiinţăm interpreterul despre acest lucru. Soluţia este parsarea.
Ştim că întregul univers al HTML-ului este alcătuit din tag-uri, respectiv markere care delimitează şi identifică anumite unităţi. Când o pagină cu extensia .php este expediată către PHP, ea este parsată, adică îi sunt analizate toate tagurile. PHP-ul expediază toate tagurile neinteresante sub forma în care le-a citit, până când ajunge la tagul care se referă numai la el. Acest tag se marchează cu , ?> sau = ?>. Foarte rar, aproape niciodată, pentru PHP se folosesc şi următoarele taguri <% %>. Aceste taguri sunt cunoscute şi ca taguri ASP şi trebuie activate special în setările lui PHP pentru a putea fi folosite (până la versiunea PHP 5.4, acelaşi lucru era valabil şi pentru tagurile ?> şi = ?>). Notă: PHP7 prevede eliminarea tagurilor ASP (<% %>) şi script (<script language="php”>), aşadar utilizarea acestora nu va mai fi suportată.
Când parserul PHP recunoaşte acest tag, conţinutul tagului se activează şi se execută scriptul. Trebuie avut în vedere că am marcat tagurile PHP cu , ?> sau = ?>, deşi acest "sau" nu este o regulă. De fapt, setarea implicită a configurării lui PHP este să recunoască doar tagurile de deschidere clar marcate, adică pe cele mai lungi (). Această setare se schimbă deseori, astfel încât PHP recunoaşte şi tagurile prescurtate, dar în cazul în care pe serverul de hosting (pe care vrem să ţinem permanent site-ul nostru) setările au rămas la valorile implicite, tagul de deschidere mai lung este varianta cea mai sigură, fiindcă cel mai probabil nu vom avea acces la fişierele de configurare (dacă nu schimbăm setările la nivelul scriptului), în cazul în care această opţiune este dezactivată. În acest curs, vom utiliza numai tagurile de deschidere lungi. Este foarte important să menţionăm (deşi acest lucru reiese logic din textul de mai sus) că PHP nu face posibilă nicio activitate după ce documentul este expediat către client. Aşadar, din momentul în care PHP a executat scriptul, a generat HTML-ul prin intermediul scriptului şi a expediat pagina, această pagină nu mai poate fi accesată. De aceea, în PHP nu putem crea animaţii sau alt tip de mişcări în browser. Pentru acestea utilizăm alte instrumente de programare, precum JavaScript, ActionScript Silverlight sau Java (Java Applet şi JavaFX).
Concluzie Din această introducere tragem concluzia că scopul cursului este producerea scripturilor PHP puse în slujba HTML-ului. Tocmai acesta este şi scopul-ţintă, deoarece PHP domină în infrastructura menţionată. Fără HTML, studierea PHP-ului s-ar reduce la gestionarea numerelor şi operaţiunilor matematice şi logice, la condiţii şi la alte calificative ale limbajelor de programare. Fără aceste componente, bineînţeles că nu vom ajunge departe în PHP, dar studierea lor va fi desigur mult mai interesantă făcând legătura cu HTML.
Mai multe informaţii Apariţia lui PHP PHP, în forma sa primară, a apărut în anul 1995. A fost creat de programatorul danez Rasmus Lerdorf, din dorinţa de a urmări prin script numărul vizitatorilor de pe pagina web a CV-ului său. Rasmus a numit acest limbaj Personal Home Pages. Această versiune primitivă a limbajului (moştenită de la limbajul C) a fost doar baza pentru dezvoltarea lui ulterioară. Ramus şi-a declarat foarte rapid proiectul ca Open Source, pentru a-l dezvolta cu ajutorul unui număr mai mare de programatori. Cel mai mare progres în perfecţionarea limbajului l-au făcut Zeev Suraski şi Andi Gutman în anul 1997, prelucrând parserul principal complet al limbajului. Adăugându-i un nou nume (PHP/FI), au adăugat şi suport pentru baza de date, prin care limbajul a obţinut forma pe care o are mai mult sau mai puţin şi în zilele noastre. În acest moment, se consideră că în jur de 60% dintre serverele web din lume funcţionează pe baza tehnologiei Apache şi astfel, în majoritatea cazurilor, se subînţelege procesarea datelor în PHP. Dacă adăugăm şi faptul că PHP (deşi nu prea des) se foloseşte şi pe alte platforme (IIS), este clar că avem de-a face cu un limbaj cu funcţionalitate complexă. Suraski şi Gutman (uniţi sub numele Zend) sunt şi astăzi principalii dezvoltatori şi promotori ai limbajului PHP. Numele complet al PHP-ului astăzi este PHP-Hypertext Processor. Instalarea manuală a PHP-ului Pachetul binar pentru instalarea PHP-ului se află la adresa http://www.php.net/downloads.php. În fişierele pe care le veţi descărca, veţi găsi şi instrucţiunile pentru instalare. De exemplu, pentru sistemul de operare Windows 7 este necesar să facem următoarele: 1. Să instalăm un server web (Apache sau Microsoft Internet Information Server - IIS); 2. Să instalăm PHP; 3. Să conectăm PHP-ul instalat la server. La adresa sus-menţionată sunt câteva fişiere. Unul dintre ele se numeşte installer.exe. Dacă descărcați acest fişier, prin pornirea lui va fi instalat PHP-ul şi vor fi setate automat anumite servere web. Alt mod de instalare este prin fişierul .zip, de pe aceeaşi adresă, dar atunci trebuie să setaţi singuri şi serverul web. Instrucţiunile complete de instalare sunt parte constitutivă a acestui fişier.
Descriere detaliată a descărcării şi instalării serverului Wamp
1. Accesaţi URL-ul: http://www.wampserver.com/en/; 2. Selectaţi opţiunea versiunii WampServer care corespunde cu sistemul dvs. de operare;
1.2 - Alegerea versiunii de WampServer 3. Selectaţi hyperlinkul download directly; Notă: Dacă înainte de instalarea serverului WAMP sistemul dvs. necesită şi instalarea lui Visual Studio 2012 : VC 11 vcredist_x64/86.exe , atunci descărcaţi-l şi instalaţi-l şi pe acesta de la linkul dat mai sus.
1.3 - Pagina de descărcare a lui WampServer
4. O să vă apară un mesaj în partea de sus a paginii:
1.4 - Linkul direct de descărcare WampServer
5. Alegeţi locaţia pentru salvarea pe harddiskul dvs. şi astfel va începe descărcarea; 6. După finalizarea descărcării, porniţi instalarea programului descărcat:
1.5 - Caseta de instalare a lui WampServer 7. Selectând folderul de instalare (care este singurul pas interactiv şi important pentru instalare),
veţi selecta şi folderul unde se va afla serverul dvs. MySQL, serverul Apache, precum şi conţinutul web:
1.6 - Selectarea locației în care va fi instalat WampServer 8. Paşii pentru selectarea browserului implicit şi a serverului de mail pot fi lăsaţi la valorile implicite; 9. La ultimul pas, lăsaţi selectată opţiunea "Launch WampServer now" pentru activarea automată a sistemului; 10. În Tray, va apărea iconiţa lui WampServer. Dacă toate serviciile funcţionează corect, iconiţa va arăta astfel:
1.7 - WampServer OK Toate celelalte variante ale iconiţei, precum, de exemplu:
1.8. WampServer Error arată că unul dintre servere nu este în stare bună de funcţionare. De obicei, acest lucru se întâmplă dacă unul dintre porturile TCP/IP necesare pentru funcţionarea serviciului este închis (MySQL server: 3306 sau Apache server: 80). Una dintre cele mai frecvente cauze este Skypeul, ceea ce înseamnă că acesta trebuie dezactivat (mai târziu, această problemă se va rezolva întrun mod mult mai elegant). 11. Testaţi funcţionarea corectă a serverului web în felul următor:
Porniţi browser-ul web; În câmpul Address al browser-ului, introduceţi adresa: http://localhost/
Rezultatul ar trebui să fie deschiderea următoarei pagini:
1.9 - WampServer - localhost O astfel de pagină în browser înseamnă că serverul web funcţionează. Pentru a verifica dacă funcţionează şi celelalte servicii (PHP şi MySQL), selectaţi unul dintre hyperlinkurile de dedesubt de subtitlul Tools (phpinfo(), pentru PHP, şi phpmyadmin, pentru MySQL). Dacă rezultatele celor două ferestre arată ca în imaginile de mai jos, înseamnă că ambele servicii (PHP, respectiv MySQL) funcţionează şi că instalarea a fost realizată cu succes:
1.10 - PHP_INFO
1.11 - PhpMyAdmin La final, este recomandată activarea opţiunii prin care paginile stocate în cache să fie încărcate din nou în browser, asta pentru a evita situaţia în care browserul nu afişează schimbările făcute în codul paginii la care lucrăm. Pentru a realiza aceasta, trebuie să mergem la elementul Tools - Internet Options al meniului derulant Internet Explorer, să selectăm opţiunea Settings din Temporary Internet Files şi apoi, în fereastra nou deschisă, să bifăm elementul Every visit to the page. Faceţi aceasta chiar dacă în acest moment nu vi se pare un lucru deosebit de important.
1.12 - Internet Properties
1.13 - Temporary Internet Files and History Settings
Descriere detaliată a descărcării şi instalării lui Notepad++ 1. Accesaţi adresa http://notepad-plus.sourceforge.net/uk/site.htm 2. Alegeţi opţiunea Download.
1.14 - Pagina de descărcare a lui Notepad++ 3. Dați click pe Download. 4. După ce aţi descărcat fişierul, porniţi instalarea. Setaţi câţiva paşi liniari (citirea licenţei şi alegerea folderului) cu componentele ca în imaginea de mai jos (dacă nu este deja setat astfel):
1.15 - Setarea lui Notepad++ 5. În ultimul pas al instalării, lăsaţi bifat câmpul pentru pornirea aplicaţiei, iar după pornire setaţi în aplicaţie limbajul la PHP, după care puteţi închide aplicaţia:
1.16 - Notepad++ Language După ce mediul a fost pregătit pentru lucru, puteţi crea propria pagină PHP. Accesaţi directorul c:/wamp/www (cu menţiunea că wamp poate fi instalat şi în alt director). În cadrul directorului www, puteţi pune propriul fişier oarecare, în care vreţi să se afle codul dvs. php. De exemplu, acesta poate fi fişierul test.php. În fişierul test.php, creaţi următorul conţinut: 1 Apoi, în browser tastaţi adresa până la fişier:
http://localhost/test.php Dacă aţi făcut totul în mod corect, pe pagină va apărea mesajul: Hello!
Lucrul cu fişierele de configurare În interfaţa sa de utilizator, Wamp face posibilă accesarea simplă a tuturor fişierelor de configurare ale serviciilor, care funcţionează sub el. Pentru a accesa fişierul de configurare pentru PHP, este necesar:
să deschidem opţiunile lui WampServer cu clic stânga în Tray; să selectăm opţiunea php.ini din submeniul PHP;
1.17 - WAMP - php.ini
să schimbăm opţiunile dorite în fişierul de configurare; să salvăm fişierul de configurare; să restartăm serviciile.
1.18 - WAMP - Restart All Services Acelaşi lucru îl putem face şi într-un mod mai complicat. Pentru aceasta, trebuie să mergem la folderul în care se află PHP (de obicei, acesta este wamp/php), să deschidem şi să schimbăm manual fişierul php.ini. Mai simplu este dacă în interfaţa de utilizator a lui Wamp alegem opţiunea PHP settings şi, pur şi simplu, activăm sau dezactivăm opţiunea dorită. Bineînţeles, această abordare este valabilă doar pentru mediul WampServer.
Instalarea PHP-ului pe sistemul de operare Linux Descărcaţi versiunea de PHP de la următoarea adresă http://www.php.net/downloads.php.
1.19 - PHP Download
Apoi, în consolă găsiţi locaţia fişierului descărcat (cel mai probabil, numele fişierului va fi: php5.x.x.tar.gz, dar numele exact depinde de versiunea PHP descărcată) şi poziţionaţi-vă în acest director. Despachetaţi arhiva descărcată cu ajutorul comenzii: tar –xzf php5.x.x.tar.gz Apoi, treceţi în folderul creat automat (php5.x.x) şi porniţi instalarea prin comanda: ./configure –prefix=/usr/local/php –with-apxs2=/usr/local/apache2/bin/apxs –
1with-mysql=/usr/local/mysql
sau printr-una din următoarele două comenzi, dacă nu ştiţi datele exacte de pe serverul Apache sau MySQL: –prefix=/usr/local/php –with-mysql=/usr/local/mysql 1./configure ./configure –prefix=/usr/local/php<span style="font-size: 14px; text-align: 2justify;">
O astfel de instalare presupune că aveţi deja instalate serverele Apache sau MySQL pe calculatorul pe care se află Linux. Astfel, veţi putea să asociaţi căile acestor două aplicaţii cu instalarea. După instalarea efectuată cu succes, faceţi compilarea prin comanda: make
şi instalarea prin comanda: make install
Zend şi CakePHP Framework Având în vedere îmbunătăţirile şi cerinţele tot mai mare din partea utilizatorilor, a început să fie utilizat şi framework-urile PHP. Cele mai populare sunt Zend şi Cake Framework. Zend Framework este un Framework Open Source pentru dezvoltarea aplicaţiilor şi a serviciilor web, utilizând PHP 5.3+. Având în vedere seriozitatea aplicării, acesta se foloseşte în cadrul blocurilor orientate pe obiect, care nu aparţin tematicii acestui curs, dar despre a cărui utilizare ne vorbeşte practic numărul de descărcări de peste 15 milioane. Acesta se poate descărca de la următorul link: http://framework.zend.com/downloads/latest
1.20 - Logoul Zend Framework CakePHP este un Framework de dezvoltare Open Source gratuit şi rapid pentru PHP. Acesta permite ca munca programatorilor să se desfăşoare într-un mod rapid şi structurat, fără pierderea flexibilităţii. Este îmbunătăţit în privinţa tuturor instrumentelor necesare, care permit scrierea codului şi se bazează pe esenţa ajungerii la o soluţie. Se poate descărca de la linkul: http://cakephp.org/
1.21 - Logoul CakePHP Framework
Introducere în PHP7 Anul 2015 este considerat ca un an foarte important pentru dezvoltarea PHP-ului, deoarece la sfârşitul anului se prevede prezentarea celei mai noi versiuni a acestui limbaj, PHP7. În afară de noile funcţionalităţi pe care le va oferi PHP7, acesta va avea şi performanţe mai bune. Îmbunătăţirea performanţelor se consideră ca unul dintre cele mai importante motive de actualizare la noua versiune. Conform indicatorilor oficiali de până acum, un număr mare de aplicaţii, care în momentul de faţă funcţionează pe versiunea PHP 5.6, vor funcţiona de două ori mai rapid pe versiunea PHP7. În favoarea acestei afirmaţii sunt date şi rezultatele cercetării, despre care puteţi afla mai multe la următorul link: http://talks.php.net/oz15#/ . Aici, vom prezenta doar două diagrame prin care sunt ilustrate comparativ WordPress CMS şi Moodle LMS, pe diferite versiuni de PHP:
1.22 - Wordpress - PHP7
1.23 - Moodle - PHP7
Deoarece în momentul de faţă nu cunoaştem sintaxa limbajului PHP, în lecţiile ce urmează vom face referire la schimbările în sintaxă pe care le aduce versiunea PHP7. Tagul PHP scris corect este: <*php *> <<>> ………………………………………………….
Tipurile de date În această lecţie, vom învăţa ce tipuri de date există în PHP. Când este vorba de variabile şi de tipurile lor, PHP are un sistem de funcţionare foarte flexibil. Mai mult, acest sistem este atât de flexibil, încât practic nici nu trebuie să ştim ce tipuri de date gestionăm şi nici care sunt restricţiile lor. Pur şi simplu, PHP va încerca să extragă ceea ce poate din informaţiile care îi sunt prezentate. Însă, o astfel de deschidere faţă de programator nu înseamnă că tipurile într-adevăr nu există, ci că lucrul cu ele este încapsulat într-un obiect simplu, pentru ca programarea să fie mai simplă şi mai rapidă.
Tipurile în PHP În clasificarea generală a tipurilor de date (acest lucru este valabil pentru aproape toate limbajele de programare), distingem tipuri simple şi complexe. În afară de clasificarea dată, putem folosi şi următoarea clasificare pentru tipurile de date:
Tipurile scalare; Tipurile compozite; Tipurile speciale.
Tipurile simple sau scalare sunt tipurile care presupun doar o singură valoare la un moment dat. PHP recunoaşte 4 tipuri simple de date:
Integer: Reprezintă tipul de număr întreg a cărui valoare depinde de magistrala procesorului şi de mediu (sistemul de operare). Dacă procesorul operează pe 32 de biţi, dimensiunea acestui tip poate fi de la -2147483647 până la 2147483647. Pentru un procesor pe 64 de biţi, valoarea maximă a acestui tip este de până la 9223372036854775807; Float: Tipul float se utilizează în PHP pentru toate operaţiile cu virgulă mobilă; String: Tipul string conţine valori textuale;
Boolean: Conţine valoarea logică (true sau false). Boolean reprezintă două stări posibile: adevărat şi fals. Valorile logice se utilizează predominant pentru compararea condiţiilor. În PHP, valoarea false corespunde uneia dintre următoarele valori: număr întreg 0, real 0.0, string gol, caracterul '0' şi constanta NULL. Orice altă valoare se consideră adevărată (true).
Avem şi 2 tipuri complexe (compozite). Tipurile complexe sunt tratate, de obicei, ca depozite sau colecţii de alte date:
Array: Conţine un şir de date. Acest şir conţine date de acelaşi tip sau de tip diferit, chiar şi alte şiruri (array). Variabila care reprezintă acest tip este, de fapt, adresa din memorie de unde începe colecţia acestor date;
Object: Conţine un obiect. Cât despre obiecte, acestea sunt nişte structuri complexe de date care conţin date şi funcţionalitate. Obiectele sunt simbolul programării orientate pe obiect şi a limbajelor de programare orientate pe obiect, inclusiv PHP, motiv pentru care vom acorda o atenţie specială obiectelor în acest curs.
Pe lângă această clasificare, mai există şi divizarea în tipuri numerice, stringuri şi Boolean. Acestea sunt, de fapt, subcategorii în cadrul clasificării generale a tipurilor. De ce ne interesează pe noi acest lucru? De ce am folosi ceva ce conţine o valoare corectă sau falsă, un număr sau un text? Să vedem formularul Facebook pentru crearea unui cont:
2.1 - Pagina de creare a unui cont Facebook
În multitudinea de informaţii care se pot introduce în acest formular, sunt marcate trei. Prima (1) este Keep me logged in. Această opţiune poate fi activată sau dezactivată, aşadar pentru salvarea acestei informaţii este nevoie doar de o stare din două posibile. Aceasta se suprapune cu tipul Boolean descris în prima parte a lecţiei. Când data ajunge la server, o vom transforma în acest tip şi vom continua să lucrăm cu ea în această formă. Evident, data naşterii se introduce prin trei meniuri derulante (controlul Select). Fiecare dintre acestea conţine o listă de numere întregi. Prin urmare, pentru toate cele trei informaţii, ideal va fi tocmai tipul de număr întreg (int/Integer) descris mai devreme. În final, pentru datele reprezentate prin căsuțe text în formular există o mare probabilitate că va fi folosit tipul string. Tipurile numerice Din acest grup fac parte integer şi float. Caracteristica acestora este că păstrează o valoare numerică. PHP îşi va da seama de tipul valorii, în funcţie de modul în care o vom introduce. Despre tipul integer am vorbit deja. Acest tip subînţelege valori marcate (negative şi pozitive), cu o dimensiune permisă de sistem. Mai mult, acesta acceptă trei tipuri diferite de notaţie: zecimală, octală şi hexazecimală. Când este vorba de notaţia zecimală, manipularea este simplă, pentru că folosim această notaţie şi în viaţa cotidiană. De exemplu, pentru a reprezenta numărul zece, vom scrie 10. Notaţia octală şi hexazecimală sunt oarecum mai complicat de utilizat, însă nu se folosesc foarte des. De fapt, notaţia octală se foloseşte cel mai des atunci când sunt manipulate drepturile în stilul UNIX (0666, 0667, 0777). Fiţi atenţi când manipulaţi numerele prin notaţia octală. Această notaţie se activează prin semnul zero în faţa numărului, lucru pe care îl puteţi face din greşeală şi atunci când lucraţi cu un număr zecimal. Acest lucru poate duce la rezultate incorecte în executarea programului. De exemplu, în PHP, 100 desemnează numărul 100, dar 0100 desemnează numărul 64. Notaţia hexazecimală subînţelege marcajul 0x (sau 0X, deoarece acest tip de notaţie nu este sensibil la litere majuscule şi minuscule), după care se scrie valoarea hexazecimală. Float (care se mai numeşte şi Double) subînţelege, de asemenea, valori marcate (pozitive şi negative), dar, spre deosebire de integer, acest tip acceptă şi valori cu virgulă mobilă (valori zecimale). Float cunoaşte două tipuri de notaţie - zecimală şi exponenţială (Decimal şi Exponential). Notaţia zecimală recunoaşte tipul tradiţional de scriere: 10.5, 0.55, etc. Vom recunoaşte scrierea exponenţială prin marcajul e (sau E - de asemenea, nu este sensibil la majuscule şi minuscule), care precedă baza numărului, urmat de numărul care desemnează numărul zero după multiplicator.
De exemplu: 1e2 = 1 * 100 = 100 sau 1.2e2 = 1.2 * 100 = 120. La manipularea tipurilor numerice, trebuie avut grijă la câteva elemente simple, dar foarte importante, care pot afecta în mod negativ fluxul programului:
Deja am menţionat că mărimea valorilor depinde mai ales de sistemul în care sunt executate. Aceasta înseamnă că, trecând de la un sistem la altul, aplicaţia noastră poate da rezultate diferite, asta în funcţie de performanţele sistemului. În PHP, tipurile Float pot da rezultate neaşteptate în timpul conversiei. De exemplu, dacă convertim următoarea expresie în tipul integer: ((0.1 + 0.7) * 10), rezultatul conversiei, deşi ar trebui să fie logic 8, va fi numărul 7. Aceasta pentru că în PHP rezultatul adunării (0.1 + 0.7)* 10 este numărul 7.999999. La conversia în integer, zecimalele acestui număr sunt pur şi simplu îndepărtate.
Stringurile În PHP, stringul este un tip de date care conţine o colecţie sortată de valori binare, care poate să reprezinte orice structură binară (imagine, sunet, text etc.). Totuşi, când spunem string, ne referim în primul rând la un conţinut textual şi este cel mai bine să-l ţinem minte ca purtător de conţinut textual. Boolean Despre tipul Boolean am spus mai multe în partea în care am abordat enumerarea tipurilor, aşadar vom menţiona doar câteva caracteristici ale conversiei:
La conversia din valoarea numerică în Boolean, toate valorile care nu sunt zero vor fi convertite în true (până şi valorile negative); La conversia stringului în valoare Boolean, doar stringurile care nu au conţinut sau conţin doar un caracter (0) vor fi convertite în false.
Pe lângă cele menţionate, PHP recunoaşte şi două tipuri de date speciale. Resource Acesta este un tip de date care este, de fapt, o referinţă la o anumită sursă de date. Este un tip special şi există funcţii speciale pentru manipularea acestui tip. Din punct de vedere fizic, acesta reprezintă un flux de date. De aceea, variabilele de acest tip se mai numesc şi Resource Stream sau doar Stream. Să luăm ca exemplu un fişier textual. Acest fişier nu este parte constitutivă a aplicaţiei, dar în el (de exemplu) există anumite date necesare pentru funcţionarea acesteia. Pentru ca un programator să poată accesa acest fişier, el trebuie tratat într-un anumit mod pe
parcursul executării programului. Dar, pentru a face aceasta, este nevoie de un obiect care să reprezinte acest fişier în cod. Acest obiect se numeşte resursă/resource. NULL De fapt, acesta nu este un tip de date propriu-zis, ci mai degrabă o valoare fixă, care, de obicei, aparţine obiectelor a căror valoare nu a fost atribuită sau a fost ştearsă. Tipul NULL poate avea doar o singură valoare: NULL.
Conversia tipurilor În majoritatea cazurilor, PHP are singur grijă de conversia unui tip în altul. Puteţi scrie simplu "1" + 2 şi rezultatul va fi 3, deşi un tip este string şi altul este număr. Totuşi, aceste conversii implicite funcţionează atunci când este vorba de tipuri simple de date, dar nu şi în cazul tipurilor complexe. Tipul simplu nu se poate converti în resursă. Pe de altă parte, ipotetic vorbind, resursa se poate converti în string, dar veţi obţine doar o reprezentare textuală a acestei resurse. Pentru a converti o valoare dintr-un tip în altul, folosim paranteze rotunde, în felul următor: (tipul în care vrem să facem conversia) valoare De exemplu, dacă am vrea să transformăm numărul 10 în string, am scrie: 1(string)10; Dacă am vrea să transformăm un string în număr întreg, am scrie: 1(int)"10"; Bineînţeles, pentru ca o astfel de conversie să aibă sens, ar trebui să fie pus între ghilimele ceva ce se poate traduce cu succes în număr (cum ar fi numărul 10 în exemplul precedent). Dacă nu asigurăm o astfel de dată, PHP nu va crea probleme, ci va face conversia cât mai calitativ posibil. În exemplul următor, ca rezultat al conversiei vom obţine cifra 0. 1(int)"a"; Următorul exemplu converteşte numărul 015 în valoare de tip număr întreg. Logic ar fi să nu se întâmple nimic şi la ieşire să obţinem numărul 15, dar rezultatul nu va fi acesta. 1$x = 015; 2echo (int)$x;
În loc de cifra 15, vom obţine cifra 13. Acesta este, de fapt, un comportament normal, deoarece valoarea $x este definită ca octală (are zero la început) şi de aceea, când se transformă în valoare zecimală, nu este 15, ci 13. De fapt, valoarea 13 am fi obţinut-o şi dacă nu am fi executat conversia, cu excepţia cazului în care hotărâm să formatăm numărul într-un alt fel la ieşire. Formatarea numerelor Deseori, la scrierea numerelor va fi nevoie şi de formatarea acestora, în cazul în care doriţi să scrieţi cifre separate cu un anumit semn sau, de exemplu, să folosiţi separatorul pentru zecimale. Pentru formatarea în formă de număr întreg, se foloseşte funcţia number_format(): 1$number= 879.22; 2echo number_format($number); Scrierea la ieşire va fi: 879 Funcţia number_format() rotunjeşte numărul pe care îl formatează la cel mai apropiat număr întreg. Valorile care se introduc în paranteze în timpul apelării funcţiei se numesc argumente sau parametri. Aceste valori pot oferi funcţiilor informaţii suplimentare, referitoare la comportamentul lor. Argumentele se separă prin virgulă. Pentru formatarea în formă de număr zecimal, se stabileşte numărul locurilor zecimale ca al doilea argument în apelarea funcţiei. Dacă în funcţie folosim numărul 879.223456: 1echo number_format($number, 2); scrierea la ieşire va fi: 879.22 După cum putem vedea, funcţia number_format() poate funcţiona doar cu unul sau cu ambii parametri. De asemenea, această funcţie poate accepta şi al treilea, şi al patrulea parametru, care este opţional, ca şi al doilea. Al treilea parametru reprezintă definiţia marcajului care se va folosi pentru separarea înregistrării zecimale, în timp ce al patrulea parametru reprezintă marcajul pentru separarea miilor în înregistrarea numărului. Exemplu: 1$x = 123456789.123; 2echo number_format($x, 2, "*", "/"); Scrierea la ieşire va fi: 123/456/789*12 De asemenea, în timpul lucrului va fi necesară şi formatarea valorilor monetare, de aceea vom explica pe scurt bazele acestei formatări. Folosind funcţia money_format(), se formatează numărul în aşa fel încât se introduce semnul pentru valuta dorită, separatorul locurilor zecimale şi separatoarele grupurilor formate din câte trei cifre care corespund regiunii date. Ca primul
argument al funcţiei se apelează %n pentru ca cifra să se scrie în formatul american pentru valută sau %i care reprezintă formatul standard pentru valuta care se foloseşte pe plan internaţional sau local. Funcţia setlocale() setează regiunea şi datele locale. Exemplu: 1 10
Notă: Funcţia money_format() va funcţiona doar pe sistemul Linux, ceea ce înseamnă că nu este suportată de sistemul Windows.
După executare, pe pagină apare următorul rezultat: SAD: $2,234.16 USD: 2,234.16 2 234.56 EUR Formatarea se poate face şi cu funcţia printf. Aceasta este ceva cu care persoanele cu experienţă în limbajul de programare C sunt familiarizate deja. În exemplul următor, numărul definit este prezentat în trei moduri: octal, zecimal şi binar, cu ajutorul funcţiei printf: 1$x = 015; 2printf("Octal x is: %o, decimal is %d, and binary is %b",$x,$x,$x); Despre funcţia printf vom discuta mai târziu, acum vom spune pe scurt că în partea cuprinsă între ghilimele se află textul care trebuie afişat şi că în acest text se află semne în locul cărora se va afla parametrul corespunzător din lista de parametri aflată după partea din ghilimele. Aceste semne încep cu semnul % urmat de semnul tipului. o este tipul numeric octal, d este zecimal, iar b este binar. În string, avem trei apariţii, iar după string avem trei parametri dintre care fiecare corespunde cu o anumită poziţie din string. Ca rezultat, vom obţine următoarea scriere pe pagină:
Octal x is: 15, decimal is 13, and binary is 1101 Time and Date (Data şi ora) Data şi ora sunt elemente foarte importante în dezvoltarea paginilor şi a aplicaţiilor web. PHP vă permite să lucraţi cu datele acestea în mod diferit faţă de stringuri. Calculatorul păstrează data şi ora într-un format care se numeşte timestamp. Acest format exprimă o anumită dată şi ora prin secunde. Fiindcă o astfel de exprimare a timpului nu este inteligibilă pentru utilizatorul obişnuit, PHP o converteşte într-o formă utilizată de oamenii obişnuiţi. Câteva dintre funcţiile PHP pentru lucrul cu ora și data sunt:
date(format) - returnează data curentă, formatată după instrucţiunile în argumentul format; checkdate(lună, zi, an) - verifică validitatea datei, adică dacă valorile pentru lună, zi şi an sunt în intervalul corespunzător; time() - restaurează timpul curent, exprimat în secunde, începând de la 01 ianuarie 1970.
În tabelul de mai jos, sunt afişate formatele valide pe care le puteţi utiliza cu funcţia date(): a A h H g G i s d D I F n Y y s
Scrie "am" sau "pm" Scrie "AM" sau "PM" Orele exprimate de la 01 la 12 Orele exprimate de la 00 la 23 Orele exprimate de la 1 la 12, fără zerouri în faţă Orele exprimate de la 0 la 23, fără zerouri în faţă Minutele (de la 00 la 59) Secundele (de la 00 la 59) Ziua din lună exprimată cu două cifre (01-31) Ziua din săptămână exprimată prin text abreviat (Mon – Sun) Ziua din săptămână exprimată prin text (Monday – Sunday) Întreaga denumire a lunii (January – December) Luna exprimată prin cifre (1-12) Anul scris cu 4 cifre (2005) Anul scris cu 2 cifre (05) Sufixele englezeşti (th, nd, st)
Tabelul 2.1 Codul care urmează afişează data și ora curentă în cadrul paginii web:
1'; 4echo 'Current time:'. date('g:i:s a'); 5?> După executare, la ieşire vom obţine: Current date: 31-1-2013 Current time: 11:33:26 am Funcţia getdate() returnează un şir de perechi cheie-valoare. Valoarea pentru chei se obţine prin punerea denumirii cheii scrise între ghilimele, în paranteze drepte, imediat după numele variabilei. Mai multe despre această temă aflaţi în lecţia „Lucrul cu şiruri”. Valorile returnate ale funcţiei getdate() sunt: Value Seconds Minutes Hours Day of the month Day of the week, numeric (Sunday is 0, Saturday is 6) Month, numeric Year, numeric (4 digits) Day of the year, numeric (e.g., 299) Day of the week, textual, full (e.g., “Friday") Month, textual, full (e.g., “January") Seconds since epoch (what time( ) returns)
Key seconds minutes hours mday wday mon year yday weekday month 0
Tabelul 2.2
1 Pentru crearea unei variabile noi, care va conţine informaţii despre data şi ora care nu este una curentă (deci este legată de trecut sau viitor), folosim funcţia date_create(). Această funcţie acceptă scrierea timpului dorit.
De exemplu: 1$newDate = date_create('2015-3-20 10:15:55'); 2echo date_format($newDate, 'd.m.Y / H-i-s'); După aceste linii de cod, rezultatul afişat pe pagină va fi: 20.03.2015 / 10-15-55
Clasa DateTime Este important de menţionat că utilizarea funcţiilor prevăzute pentru formatarea şi prezentarea datei şi a timpului nu este singurul mod de a lucra cu datele menţionate. Clasa DateTime în PHP este ceva mai avansată decât tematica acestui curs, de aceea nu ne vom opri la ea mult timp. Clasa DateTime aparţine stilului orientat pe obiect şi în continuare vom menţiona diferenţa dintre scrierea de până acum şi cea orientată pe obiect. În exemplele precedente, pentru o scriere la ieşire precum 2015-01-01 00:00:00 am folosit următorul cod: 1 Însă, pentru stilul orientat pe obiect, codul este: 1format('Y-m-d H:i:s'); 4?> Având în vedere că acum aveţi două moduri diferite de codare şi două cereri diferite de scriere şi formatare a datei şi a orei, dvs. puteţi decide cum doriţi să lucraţi în continuare. Alegeţi tipul compozit de date: Integer Boolean Array Float String Tipul de dată Boolean poate avea valoarea: 10.50
my text TRUE array()
Problema nr. 1 În aplicaţie, parola de identificare a utilizatorului se memorează în felul următor: 1 La emiterea acestui număr, la ieşire apare următoarea valoare: 1.1793847250046E+16 Asupra acestui număr (parolă) nu se fac niciun fel de operaţii aritmetice, dar la ieşire parola trebuie să fie afişată în modul adecvat. Rezolvare: Cel mai bine este ca valorile numerice mai mari, care nu necesită operaţii aritmetice, să se reprezinte sub formă de string: 1
Problema nr. 2 În cadrul aplicaţiei PHP, se află o linie care emite date despre data și ora curente: 1 Linia emite următorul rezultat: Current time: 11:45h, day is: Wed/Jan/13 Utilizatorul doreşte să reprezinte data în următorul format:
Current time: 11:45, day is: 16/01/2013
Rezolvare: 1 În stabilirea sarcinii, ca argument al funcţiei Date este folosit stringul cu structura "D/M/y". Cu acest string definim formatul datei care va fi prezentat. Deja în stabilirea sarcinii se poate observa că astfel de definiţie a formatului datei va returna scrierea Wed/Jan/13. În rezolvare, avem stringul modificat care se transmite funcţiei şi arată astfel: "d/m/Y". Din acest motiv va fi schimbat şi rezultatul prezentat pe pagină şi acum va fi scris astfel: 16/01/2013. În tabelul dat în conţinutul lecţiei, puteţi să vedeţi şi celelalte variante posibile pentru formatarea orei şi a datei.
Problema nr. 3 În cadrul aplicaţiei, trebuie să se facă un sistem care va monitoriza operaţia de logare (dacă utilizatorul este logat sau nu). Trebuie să se determine tipul de dată în care va fi depozitată această informaţie.
Rezolvare: Acest tip poate fi Boolean (true sau false), deoarece există două valori posibile, adevărat sau fals. ………………………………………….
Variabilele În această lecţie, accentul va fi pus pe definiţia variabilei şi pe implementarea ei în limbajul PHP.
Variabilele în PHP Variabilele sunt containere temporare de depozitare a anumitor valori. După ce o valoare se depozitează în memorie, ea este reprezentată prin variabilă. Tipurile de date pe care o variabilă le poate reprezenta sunt, bineînţeles, toate tipurile studiate în lecţia precedentă.
În lecţia precedentă, am menţionat că PHP este capabil să convertească în mod automat şi implicit un tip de dată în altul, asta în funcţie de operaţia executată asupra sa. Această caracteristică a limbajului se numeşte Loosely typed (există şi Strong typed). Aceasta înseamnă că nu va fi nevoie să acordăm o mare atenţie asupra modulului în care am declarat un anumit tip, atâta timp cât ne adresăm acestui tip în mod adecvat. De fapt, atunci când vorbim de variabile în PHP, există doar câteva reguli de care trebuie să ţinem cont:
Variabilele trebuie să aibă semnul $ înainte de o denumire concretă; o Exemplu: $x sau $first_name
Denumirea variabilei trebuie să înceapă cu o literă sau cu underscore (_); o Exemplu: $a sau $_a
Denumirea variabilei poate avea şi litere (a-z,A-Z), cifre (0-9) şi semnul (_); PHP este sensibil la litere majuscule şi minuscule, atunci când este vorba de variabile; o Exemplu: $c_number şi $C_number sunt două variabile diferite.
Denumirile pentru variabile nu pot conţine spaţiu gol (spaţiu/white space), ci în loc de acesta se poate folosi underscore (_); o Exemplul unei denumiri incorecte: $first name o Exemplul unei denumiri corecte: $first_name
Deşi atunci când denumim variabilele nu trebuie să respectăm niciun fel de reguli de limbaj, este de preferat să folosim una din convenţiile de scriere. Una dintre cele mai populare este notaţia "Camel Case", care subînţelege litera majusculă la începutul fiecărui cuvânt din variabilă. De ex. $MyVariabile sau $thisIsMyVariabile. Să zicem că vrem ca în program să existe o variabilă cu denumirea $x şi care are valoarea 10. Vom scrie: 1$x = 10; În continuarea programului, vom avea la dispoziţie variabila $x cu valoarea 10. Şi, dacă scriem: 1echo $x; pe pagină va fi scrisă cifra 10. Dacă scriem: 1$myVar = "Hello!"; 2echo $myVar;
pe pagină va fi scris mesajul Hello! În PHP, la denumirea unei variable se poate atribui valoarea unei alte variabile. De exemplu: 1$mp = "myVar"; 2$$mp = "content of myVar"; În acest caz, la denumirea unei alte variabile am atribuit valoarea primei variabile (mp), astfel încât acum se poate ajunge la valoarea celeilalte variabile prin variabila: 1$myVar; De asemenea, această valoare se poate obţine şi prin variabila: 1$$mp; Dar şi când definim variabilele astfel, trebuie respectate regulile referitoare la numele variabilelor. De exemplu, dacă definim variabila 123 în modul următor: 1$mp = "1myVar"; 2$$mp = "content of myVar"; atunci când apelăm această variabilă ($myVar), s-ar produce o eroare, deoarece nu este permisă utilizarea numerelor la începutul variabilei. Cu toate acestea, variabila şi valoarea care îi este acordată vor fi depozitate în memorie şi vor fi accesibile prin următoarea sintaxă: 1${'1myVar'} Trebuie să acordăm o deosebită atenţie unei astfel de abordări pentru că, dacă este inadecvată, în aplicaţie pot apărea uşor probleme de securitate. În PHP, nu există niciun mod de a securiza în totalitate existenţa unei variabile dintr-un anumit punct din program, ceea ce poate duce la probleme funcţionale şi de securitate. De aceea, pentru a reduce problema cauzată de acest dezavantaj, se foloseşte funcţia isset(), care examinează existenţa unei variabile. Această funcţie acceptă numele variabilei ca parametru şi returnează valoarea de tip Boolean ca rezultat. isset($myVar) Dacă $myVar este definită anterior în cod, funcţia isset va returna valoarea true. În caz contrar, această funcţie va returna valoarea false (vom vorbi mai mult despre funcţii în lecţiile următoare).
Cu toate acestea, dacă manipulaţi variabile inexistente, PHP va fi capabil să proceseze astfel de variabile în mod adecvat. De exemplu: $a + 2 În cazul în care variabila $a nu există în codul anterior, PHP o va trata ca şi cum aceasta a avut valoarea zero, iar rezultatul acestei expresii va fi 2. Un lucru similar se va întâmpla şi dacă expresia este: $a + $b iar atunci rezultatul va fi zero, deoarece ambele variabile sunt tratate ca zerouri, chiar dacă nu au fost definite în prealabil. Acest rezultat va depinde de setările din fişierul php.ini. Inexistenţa variabilei poate produce o eroare.
Domeniul variabilei Declararea variabilelor nu se limitează la declaraţie în funcţie de valoare sau referinţă, ci acestea pot fi declarate oriunde, bineînţeles, în cadrul scripturilor php. Însă, când este vorba de locaţia variabilei, poate apărea o problemă de disponibilitate. Problema apare dacă declaraţi variabila într-o parte a aplicaţiei şi o apelaţi în altă parte, mai exact dacă declaraţi variabila în cadrul unei bucle, funcţii sau clase şi doriţi să o accesaţi în afara acestor cadre, programul se va alarma şi va spune că variabila nu există. Astfel, ajungem la domeniul de accesibilitate a variabilelor. Variabilele PHP pot să aparţină unuia dintre cele patru domenii de vizibilitate:
Variabile locale; Parametrii funcţiilor; Variabile globale; Variabile statice.
Variabile locale - Variabilele care sunt declarate doar în cadrul funcţiei se numesc locale şi se pot folosi doar în cadrul funcţiei respective. Dacă am încerca să-i atribuim variabilei o valoare în afara corpului funcţiei, PHP va trata variabila respectivă ca pe una complet diferită, care nu are legătură cu ceea ce este declarat în corpul funcţiei. Variabilele locale se folosesc pentru eliminarea eventualelor efecte secundare reprezentate printre altele şi modificări întâmplătoare sau intenţionate ale variabilelor accesibile global. În următoarea ilustraţie, putem vedea o variabilă definită în cadrul funcţiei php şi una definită în afara ei:
3.1 - Variabile cu acelaşi nume, definite în afara şi în cadrul funcţiei Aceste variabile nu se vor influenţa una pe cealaltă. Dacă vreţi să demonstraţi acest lucru într-un exemplu, puteţi scrie următorul cod (unele elemente ale exemplului încă nu sunt explicate în această parte a cursului, dar sunt necesare pentru ca exemplul să fie complet): 1 2 // Defines the variable with name x and the value 20 3 $x = 20; 4 //defines function f function f(){ 5 //Within a function, defines the variable x with value 10 6 $x = 10; //Printing variables on the screen 7 echo $x; 8 } 9 //Calling function f 10f(); 11//Printing variable x 12echo $x; 13 Parametrii funcţiilor – Despre funcţii vom discuta în detaliu în continuarea cursului. Acum, ne vom ocupa doar de parametrii funcţiei, respectiv de argumentele funcţiei. După cum se ştie deja, fiecare funcţie care acceptă nişte parametri (de exemplu, de la intrare) trebuie să aibă anumite argumente în antetul său (de fapt, aceste argumente sunt parametri). Este important de menţionat că argumentele obţin valori în afara corpului funcţiei căreia îi aparţin şi acestea nu pot fi accesate după finalizarea executării funcţiei. Aceste tipuri de variabile (parametrii funcţiei) se declară după introducerea denumirii funcţiei între paranteze. Exemplu: 1//Function f is defined 2function f($x) 3{ 4//Variable x increases by 5 5$x = $x + 5; } 6 Pentru ca această funcţie să fie iniţiată, va trebui să scriem:
1f(10); Respectiv, am putea scrie: 1//Variable x is defined with the value 10 2$x = 10; 3//Calling function f i with argument x 4f($x); 5//Value of variable x shows on display echo $x; 6 Dacă am porni codul precedent (în combinaţie cu funcţia definită înainte), la ieşire ar fi afişată cifra 10. Fiindcă variabila este introdusă în funcţie ca parametru, aceasta este tratată în interiorul ei şi nu influenţează funcţia externă. Variabile globale – Putem spune că variabilele globale sunt opusul variabilelor locale pe care leam explicat. Variabilele globale pot fi accesate din orice parte a programului. Pentru a avea posibilitatea să modificăm o variabilă, aceasta trebuie declarată explicit ca şi globală în cadrul funcţiei în care vrem să facem modificarea. Setarea variabilei globale trebuie menţionată cu ajutorul cuvântului-cheie global în faţa variabilei dorite. Exemplu: 1 2 $my_variable = 10; 3 4 //Function without arguments function f() 5 { 6 //Variable my_variable is global 7 global $my_variable; //Variable my_variable increases by 1 8 $my_variable++; 9 } 10f(); 11//Result shows on display 12echo "Result is " . $my_variable; 13 După execuţia funcţiei, rezultatul este 11, însă, dacă am omite definirea variabilei drept globală (global $my_variable), variabila $my_variable ar avea o valoare nedefinită după execuţia funcţiei, deoarece în acest caz este tratată ca variabilă locală. Al doilea mod de utilizare a variabilelor globale este prin declararea variabilei sub formă de câmp $GLOBALS. Acum, vom modifica exemplul precedent astfel încât variabila $my_variable să fie globală cu ajutorul şirului $GLOBALS: $my_variable=10;
1function f() {
$GLOBALS["my_variable"]++; 2 } 3 f(); 4echo "Result is ". $my_variable; 5 6
După executarea acestui cod, pe pagină obţinem următoarea reprezentare: Result is 11 deoarece în funcţie nu am creat o nouă variabilă, ci am accesat-o pe cea globală, folosind şirul $GLOBALS. Variabile statice – spre deosebire de variabilele pe care le-am menţionat în cadrul domeniului parametrilor funcţiilor, variabilele statice nu sunt distruse după realizarea calculelor care se fac în funcţie. Variabila statică nu-şi pierde valoarea după execuţia funcţiei, ci valoarea variabilei rămâne şi la următorul apel al aceleiaşi funcţii. Variabilele statice se utilizează, de obicei, pentru crearea funcţiilor recursive. Cu alte cuvinte, funcţiile recursive sunt acele funcţii care se apelează singure până când este îndeplinită condiţia corespunzătoare care se stabileşte în avans.
Utilizarea variabilelor statice Când vrem ca variabila locală să-şi menţină propria valoare între apelurile funcţiei, trebuie să o declarăm statică, respectiv să o declarăm cu ajutorul cuvântului rezervat static, de exemplu: static $a = 1; Exemplu fără utilizarea variabilei statice: 1 2"; 5} 6incrementFunc(); 7incrementFunc(); incrementFunc(); 8?> 9 Pentru că în urma fiecărei apelări a funcţiei a fost creată o nouă variabilă locală $x, care nu este statică, astfel şi valoarea sa iniţială va fi întotdeauna 10. De aceea, pe ecran va fi afişat următorul rezultat:
11 11 11 Iată un exemplu în care este folosită variabila statică: 1 2"; 5} 6incrementFunc(); incrementFunc(); 7incrementFunc(); 8?> 9 Rezultatul obţinut pe ecran este: 11 12 13 Variabilele statice sunt strâns legate de utilizarea claselor (conceptul orientat pe obiect).
Variabile superglobale PHP-ul oferă posibilitatea de utilizare a unui număr mare de variabile predefinite, care se accesează în interiorul scriptului care se execută, dar care vă pot oferi posibilitatea de a avea o imagine asupra informaţiilor suplimentare legate de mediu. Informaţiile de acest tip pot fi, de exemplu, informaţii despre client, software-ul de server etc. Încercaţi să executaţi codul din următorul exemplu şi să analizaţi scrierea obţinută, pentru a observa informaţiile returnate de către server: Exemplu: 1foreach ($_SERVER as $var => $value) echo $var . ":" . $value . '
'; 2 Prin executarea codului, veţi obţine un număr mare de informaţii care probabil nu vor însemna mare lucru pentru dvs., însă, dacă aveţi nevoie de o informaţie specifică, de exemplu adresa IP a calculatorului dvs., o puteţi prelua de aici: 1printf(Your IP address is: %s ', $_SERVER['REMOTE_ADDR'] );
Constante În ceea ce priveşte valorile definite de utilizator, pe lângă variabile mai există un tip a cărui valoare odată iniţializată rămâne fixă. Aceste tipuri se numesc constante. Utilizăm constantele atunci când ştim sigur că valoarea iniţializată nu se va schimba pe parcursul executării programului. O altă caracteristică a constantelor (pe lângă regulile tipice pentru variabile) este că acestea nu trebuie să conţină semnul $ în faţa denumirii variabilei. Cel mai bun exemplu de valoare a unei constante este 3.14 (respectiv PI). Constantele se creează prin comanda define ("numele constantei", valoarea). De exemplu: 1define("CURRENCY", 80.2); 2define("UNIVERSITY", "ITS"); 3define("PI", 3.14); Conform convenţiei, constantele primesc denumiri scrise cu litere majuscule, dar aceasta nu este o regulă. PHP acceptă şi litere minuscule în denumirea constantei. Atunci când denumim constantele, trebuie să avem grijă să nu folosim cuvintele-cheie PHP. PHP are multe constante încorporate, pe care le puteţi utiliza în codul dvs. Unele dintre acestea sunt: __LINE__ - numărul liniei pe care este apelată constanta; __FILE__ - numele fişierului în care este apelată constanta. La iniţializare, trebuie să reţinem că constanta poate accepta numai date de tip scalar.
Declararea variabilelor În alte limbaje de programare, este necesar ca variabila să fie declarată înainte de a-i fi atribuită valoarea. În PHP, este suficient doar să i se atribuie valoare variabilei. Înainte de depozitarea valorii în memorie, PHP determină singur tipul de valoare şi o înregistrează în formatul corespunzător. Dacă trebuie, PHP converteşte automat un tip de date în altul. De exemplu: 1$first_number = 1; // like integer $second_number = 1.1; // like float 2$sum = $first_number + $second_number;<span style="font-size: 14px; text3align: justify;"> În a treia comandă, se adună două valori diferite. Înainte de adunare, PHP converteşte valoarea de tip număr întreg într-unul real, pentru ca adunarea să fie posibilă. Pentru atribuirea sau schimbarea valorii unei variabile, folosim operatori.
Greşeli în timpul folosirii operatorilor = şi == Dacă trebuie să comparaţi o anumită valoare cu o variabilă, trebuie să fiţi atenţi să nu atribuiţi valoarea variabilei cu care faceţi comparaţia. Deşi vi se poate părea confuz, iată explicaţia care vă va împiedica să faceţi cea mai frecventă greşeală a începătorilor. Codul dvs. trebuie să arate astfel: if($my_variable==10) { ... } În niciun caz astfel: if($my_variable=10) { ... } De comanda if ne vom ocupa în detaliu în lecţiile care urmează, aşadar explicaţia acestui exemplu va fi suficientă dacă spunem că prin comanda if verificăm dacă este îndeplinită o anumită condiţie (în cazul nostru, dacă variabila $my_variable are valoarea 10). Dacă este îndeplinită condiţia, atunci blocul de cod specificat între paranteze acolade va fi executat. Pe de altă parte, dacă condiţia nu este îndeplinită, acest bloc de cod va fi omis. Tocmai o astfel de verificare se execută cu operatorul ==. Dacă vrem să atribuim o valoare variabilei $my_variable, vom folosi operatorul de atribuire =. Scopul acestei părţi din lecţie este explicarea diferenţei dintre cei doi operatori.
Atribuirea valorilor implicite variabilelor Alocarea valorilor implicite variabilelor o putem face în mai multe feluri. În primul rând, vom folosi funcţia isset() în felul următor: 1// Checking existence of variable 2if (!isset ($cars)){ 3// If the variable does not exist, it will be created 4$cars = $default_cars; 5} Când vrem să adăugăm o valoare implicită unei variabile care înainte nu avea atribuită o altă valoare, putem folosi şi operatorul ternar (a ? b : c) în felul următor (despre operatorul ternar vom mai discuta în următoarele lecţii): 1$cars = isset($_REQUEST['cars'])? $_REQUEST['cars']:$default_cars; Dacă $_REQUEST['cars'] nu există, variabilei îi va fi atribuită valoarea $default_cars. În caz contrar, valoarea variabilei $cars va fi atribuită din variabila superglobală $_REQUEST['cars']. Funcţia isset() verifică:
existenţa unei variabile dacă o variabilă are o valoare de tip număr întreg dacă o variabilă este string dacă utilizatorul este logat
Problema nr. 1 În aplicaţia existentă, există un set de variabile conectate la baza de date creat în felul următor: 1 6
"localhost"; "root"; ""; "myDB";
Trebuie modificate variabilele pentru a fi mai intuitive.
Rezolvare: Aceste variabile nu au denumiri intuitive şi este foarte posibil să coincidă cu alte variabile în cadrul aplicaţiei. Denumiri mai bune ar fi, de exemplu: 1 6
Problema nr. 2 Nu funcţionează o aplicaţie simplă care adună două numere şi emite rezultatul la ieşire. Trebuie corectată eroarea: 1
Rezolvare PHP este sensibil la litere mari şi mici, iar în ultima linie a aplicaţiei, în loc de $y se află $Y, ceea ce cauzează o eroare, deoarece variabila $Y nu există: 1
Problema nr. 3 Trebuie realizat un set de constante, care vor fi utilizate pentru manipularea bazei de date. În acest moment, există variabilele: 1
6 Rezolvare: Crearea constantei se face cu ajutorul funcţiei define(). Această funcţie creează implicit constantele case-sensitive (sensibile la majuscule și minuscule). Primul parametru al funcţiei este numele constantei, în timp ce al doilea este valoarea ei. Se poate seta şi al treilea parametru opţional, cu care s-ar putea stabili dacă numele constantei nu este sensibil la majuscule și minuscule (case-insensitive). …………………….
Operatorii Principalul subiect al acestei lecţii va fi reprezentat de operatorii în PHP. Pentru a crea un program, mai mult sau mai puţin funcţional în orice limbaj, pe lângă variabile, mai avem nevoie şi de operatori. Aceştia se clasifică în: operatori de atribuire, operatori aritmetici, operatori de comparaţie şi operatori logici. Mai există și câteva categorii de operatori (operatori string,
operatori de incrementare şi decrementare, operatori array), dar aceştia, după cum veţi vedea în continuare, se bazează, în general, pe cele patru tipuri de operatori menţionaţi anterior. Operatorii de atribuire subînţeleg atribuirea unei valorii pentru o anumită variabilă: 1$a=10; 2$x='Hello world!'; 3$z=3; Este clar că principalul operator de atribuire este semnul = Totuşi, există şi anumite combinaţii de semne care au, de asemenea, posibilitate de atribuire, dar despre ele se poate spune mai degrabă că sunt abrevieri decât operatori (despre ele vom discuta mai târziu): $x+=5; //is same like $x=$x+5; $x-=1; //is same like $x=$x-1; Atribuirea implicită a valorilor pentru variabile este prin valoare. Aceasta înseamnă că, în momentul în care o valoare este atribuită unei anumite variabile, această valoare va fi, de fapt, cuprinsă în variabila respectivă: Când scriem următoarele: 1$x=3; programul nostru ocupă o porţiune mică din memoria calculatorului, iar în această porţiune pune numărul 3. De asemenea, ne-a informat că această porţiune mică de memorie va răspunde la „numele” x. Aceasta înseamnă că, dacă scriem: 1$x=3; 2$y=$x; 3$x=5; variabila $y va avea valoarea 3, după ce toate liniile vor fi executate. Acest lucru este foarte logic. Am creat variabila x, i-am atribuit valoarea 3, apoi am creat variabila y şi i-am acordat valoarea variabilei x (3), iar apoi am schimbat valoarea variabilei x în 5, dar valoarea variabilei y continuă să fie 3, deoarece în linia $y=$x; valoarea atribuită a fost deja executată:
4.1 - Starea în memorie în timpul atribuirii variabilelor Acum, să analizăm un alt exemplu. De fapt, este vorba despre acelaşi exemplu, dar cu semnul & adăugat pe al doilea rând. În programare, acest semn reprezintă o adresă de memorie. 1$x=3; 2$y=&$x; 3$x=5; După executarea acestui cod, valoarea variabilei y va fi 5, situaţie pe care o vom explica imediat. Mai devreme, am descris procesul de atribuire prin valoare, când valoarea a fost localizată direct în memorie, dar în cazul atribuirii prin referinţă (din al doilea exemplu), în memorie se stochează doar adresa. Aceasta înseamnă că, dacă scriem următorul lucru: $y=&$x; programul nostru va lua din nou o porţiune mică de memorie, dar de data aceasta nu stochează în ea numărul 3, ci numărul care reprezintă adresa de memorie a variabilei x:
4.2 - Starea în memorie după atribuirea referinţei Dacă acest lucru sună destul de complicat, gândiţi-vă la redirecţionarea apelurilor de pe telefonul dvs. Funcționează în același fel. Nu trebuie să vă preocupaţi foarte mult de atribuirea prin referinţă. În PHP, o veţi folosi foarte rar din proprie iniţiativă. Pe lângă faptul că este mai complicată, această abordare în PHP este mai lentă decât atribuirea prin valoare (ţineţi minte că PHP este unul dintre puţinele limbaje în care expedierea prin referinţă este mai lentă decât expedierea prin valoare). Pe de altă parte, sunt anumite situaţii când veţi atribui valori prin referinţă fără să vă daţi seama. De exemplu, atunci când utilizaţi obiecte sau şiruri, acestea pot funcţiona numai astfel.
Crearea variabilelor dinamice Uneori, de exemplu, când lucraţi cu baza de date şi doriţi ca variabilele dvs. să aibă aceleaşi nume precum câmpurile din baza de date sau, pur şi simplu, când nu ştiţi cum se numeşte o variabilă înainte să o folosiţi, folosiţi variabile dinamice. În PHP, variabilele dinamice se creează prin punerea în faţa numelui variabilei, a cărei valoare este la fel ca numele variabilei, a prefixului $. Într-un exemplu concret, aceasta arată astfel: 1
2$car = 'opel'; 3$opel = 23; print $$car; 4?> 5 După pornire va fi scrisă cifra 23, deoarece doar variabila $opel a fost apelată dinamic. Ce se întâmplă în PHP în momentul specificării dinamice? Când prefixul este $$, PHP specifică faptul că ia valoarea din partea dreaptă şi că acest nume îl foloseşte ca nume al adevăratei variabile. Acest lucru este, de fapt, foarte logic, deoarece, dacă avem o variabilă care se numeşte $car, dar şi un string a cărui valoare este „opel”, trebuie să le unim pe cele două într-un anumit mod şi să scriem ceva de genul $"opel", lucru pe care îl obţinem, de fapt, cu variabilele dinamice.
Operatorii aritmetici Fiecare operaţie aritmetică necesită un operator aritmetic (+, -, *, /, %). Semnele pentru adunare şi scădere sunt clare, în timp ce ceilalţi trei operatori sunt: * pentru înmulţire, / pentru împărţire şi % pentru rest. Operatorul pentru rest reprezintă un număr întreg care este restul împărţirii a două numere: 10%3 dă valoarea 1 (ca rezultat) 10%4 dă valoarea 2 Atunci când efectuăm operaţii aritmetice, trebuie să fim atenţi la ordinea de executare a acestora. În PHP, operaţiile matematice urmează aceeaşi ordine de executare ca în matematică. Înmulţirea şi împărţirea au prioritate în faţa adunării şi scăderii. Ordinea de executare a operaţiilor se poate schimba prin utilizarea parantezelor. Atunci când încercaţi să aplicaţi unul dintre aceşti operatori asupra variabilelor, rezultatul operaţiei va depinde de tipul de dată stocată în variabile. De exemplu, după executarea următoarelor comenzi: 1$number1 = 1; 2$number2 = 2; 3$result = $number1 + $number2; variabila result va conţine valoarea 3. Variabilele $number1 şi $number2 sunt definite ca variabile numerice, prin urmare rezultatul adunării lor este suma numerelor conţinute. Totuşi, situaţia se schimbă dacă creaţi una dintre variabile ca variabilă de tip string. De exemplu, după executarea comenzii: $number1 = "1";
1$number2 = 2;
2$result = $number1 + $number2; 3 variabila $number1 este creată ca variabilă de tip string. Înaintea adunării, PHP va converti în mod automat valoarea textuală în număr. În acest caz, valoarea "1" va fi convertită în numărul 1, iar rezultatul adunării va fi 3, ca în cazul precedent. Însă, în următoarele comenzi: 1$number1 = "x"; 2$number2 = 2; 3$result = $number1 + $number2; având în vedere că valoarea primei variabile nu este număr, PHP va converti variabila $number1 în numărul 0, astfel că valoarea variabilei $result va fi 2. În majoritatea cazurilor, PHP va converti valoarea de tip string într-un număr necorespunzător. Priviţi următorul exemplu: 1$number1 = "2,000"; 2$number2 = 2; 3$result = $number1 + $number2; Valoarea primei variabile ar trebui să fie 2000 sau cel puţin aşa o înţeleg oamenii, dar PHP înţelege virgula ca fiind sfârşitul numărului, aşadar variabila $number1 va fi convertită în numărul 2, iar rezultatul adunării va fi numărul 4. De aceea, nu trebuie să ne bazăm pe conversia automată, ci trebuie să avem grijă ca fiecare variabilă să aibă atribuită valoarea corectă atunci când este creată, pentru a putea fi supusă oricărei operaţii. Notă: Începând cu versiunea PHP 5.6, este inclus încă un operator aritmetic. Este vorba de operatorul pentru expresia exponenţială (numit şi operator exponenţial), respectiv operatorul de putere. Puterea este o operaţie matematică binară, care se scrie ca: ab unde a reprezintă baza, iar b este exponentul. Semnul pentru acest operator este: ** Aplicare: În partea stângă a operatorului se introduce baza, iar în partea dreaptă se introduce exponentul. Exemplu: $x = 10 ** 2; Această operaţie ar fi dat acelaşi rezultat ca şi 10 * 10, respectiv 100. Trebuie avut în vedere că acest operator nu va fi disponibil dacă se foloseşte WampServer, care suportă o versiune de PHP mai veche decât versiunea 5.6.
Pe lângă operatorii matematici de bază, PHP oferă şi operatori de incrementare şi decrementare (de mărire şi micşorare a valorilor): Operator ++ -+= -= *= /=
Utilizare $număr++; $număr--; $număr+=2; $număr-=2; $număr*=2; $număr/=2;
Semnificaţie $număr=$număr+1; $număr=$număr-1; $număr=$număr+2; $număr=$număr-2; $număr=$număr*2; $număr=$număr/2;
Tabelul 4.1 - Tabelul operatorilor prescurtaţi După cum se vede şi în tabel, unii dintre operatori sunt unari, adică necesită doar o singură valoare pentru a funcţiona. În unele cazuri, dacă dorim să facem incrementarea prin valoare explicită (valoarea implicită este 1), atunci vom folosi şi a doua valoare în operator. În cazul operatorilor de incrementare şi decrementare, poziţia operatorului este foarte importantă. Deşi următoarele două expresii sunt identice în ceea ce priveşte valoarea finală a variabilei $a: $a++ ++$a viaţa acestei variabile pe parcursul executării operatorului nu este la fel. Acest lucru se poate constata foarte uşor prin următorul exemplu: 1$a=1; 2$x=$a++; După executarea liniilor de cod, variabila x va avea valoarea 1, dar dacă schimbăm a doua linie cu: 1$x=++$a; variabila x va avea valoarea 2. Aşadar, este clar ce s-a întâmplat. În primul exemplu, incrementarea este executată după atribuirea valorii, iar în al doilea, atribuirea valorii s-a desfăşurat după incrementare. Este de prisos să vorbim despre consecinţele pe care le poate produce manipularea neatentă a operatorilor de incrementare.
În afară de operatori, pentru lucrul cu numere se pot folosi şi funcţiile integrate ale PHP-ului, cum ar fi: funcţia sqrt() pentru calcularea rădăcinii pătrate a unui număr, funcţia abs() pentru calcularea valorii absolute a numărului, funcţia ceil() care rotunjeşte numărul la primul număr întreg care este mai mare, funcţia floor() care rotunjeşte numărul la primul număr întreg care este mai mic, funcţiile max() şi min() care calculează valoarea maximă şi valoarea minimă şi altele. Mai ţineţi minte problemele referitoare la conversia numărului zecimal în număr întreg (când numărul 7.999999 dădea ca rezultat numărul 7)? Astfel de probleme se rezolvă tocmai prin funcţiile matematice. Lista funcţiilor matematice o puteţi găsi la următoarea adresă: http://php.net/manual/en/ref.math.php
Operatorii de concatenare a stringurilor Nu vom acorda multă atenţie acestei părţi, din două motive. Primul motiv este că nu sunt foarte multe de spus despre acest subiect, iar al doilea, că vom studia stringurile în detaliu într-o lecţie următoare. Concatenarea (unirea stringurilor) se face prin semnul de punctuaţie . (punct) Următoarea linie: 1$name = "Link" . " Group"; va acorda variabilei name valoarea „Link Group”. De asemenea, şi aici puteţi utiliza un anumit tip de operatori de incrementare (cu condiţia ca name să aibă deja valoarea din exemplul precedent ("Link Group")), astfel încât după următoarea linie valoarea variabilei name va fi “Link Group d.o.o.”. 1$name .= " d.o.o."; şi, bineînţeles, versiunea extinsă a aceleiaşi linii: 1$name = $name . " d.o.o."; De ce am folosi un astfel de operator? Să vedem următoarea ilustraţie. În ea se află două părţi ale site-ului Facebook. Una este Sign Up, formular prin intermediul căruia ne putem înregistra la Facebook, iar a doua este statusul utilizatorului, respectiv panoul care reprezintă statusul utilizatorului logat.
Focusul este pe prenume şi nume. Vedem că în formularul Sign Up prenumele şi numele sunt separate. Asta înseamnă că aceste date vor fi separate şi în baza de date, şi în scriptul PHP. Acestea vor fi reprezentate prin intermediul a două variabile. De exemplu: $prenume şi $nume. În statusul utilizatorului, aceste date sunt unite: Peter Jackson. Pentru ca datele să fie unite, cel mai probabil autorul scriptului a folosit tocmai operatorul pentru concatenarea stringurilor.
4.3 - Reprezentarea panoului de utilizator Facebook şi a părţii din formularul Sign Up
Operatorii de comparaţie Acest tip de operatori compară anumite valori şi, ca rezultat, dau valori de tip Boolean. Marcajele sunt:
== este egal (operanzii au aceeaşi valoare, însă nu trebuie neapărat să fie de acelaşi tip); != nu este egal; < mai mic decât; > mai mare decât; >= mai mare decât sau egal cu; <= mai mic decât sau egal cu; === este identic (operanzii au aceeaşi valoare şi acelaşi tip); !=== valoarea nu este egală sau tipul nu este egal.
Să vedem câteva exemple: Dacă am avea două variabile, $x şi $y, unde $x=10, iar $y=20, am putea compara valorile lor cu ajutorul operatorului de comparaţie.
Dacă am vrea să întrebăm dacă $x este egal cu $y, am scrie: $x==$y Codul scris astfel va da ca rezultat tipul Boolean. În acest caz, valoarea este false, deoarece $x şi $y nu au aceeaşi valoare. Bineînţeles, dacă am scrie doar comparaţia a două valori, codul nu ar avea niciun sens. De aceea, operatorii de comparaţie se folosesc cel mai des în combinaţie cu expresiile condiţionate. De exemplu, dacă vrem să scriem mesajul "Hello!", dacă $x este egal cu $y, vom scrie: 1if($x==$y) echo "Hello!"; Dacă pornim codul scris mai devreme, nu vom obţine mesajul "Hello!", deoarece $x nu este egal cu $y. De aceea, am putea să schimbăm condiţia şi să scriem: dacă $x nu este egal cu $y, scrie mesajul. Atunci am putea să folosim negaţia şi să scriem: if($x!=$y) echo "Hello!";<span style="font-size: 14px; text-align: justify;">
Apoi, pe baza aceluiaşi principiu am putea să folosim şi toţi ceilalţi operatori menţionaţi. Ultimii doi operatori sunt puţin mai greu de înţeles în acest moment, motiv pentru care este bine să îi clarificăm prin practică. Să luăm următorul bloc: 1$x = 1; 2$y = "1"; 3$z = $x == $y; Valoarea variabilei $z după acest cod ar fi true, deoarece variabilele $x şi $y au aceeaşi valoare. Dar, după executarea următorului cod: 1$x = 1; 2$y = "1"; 3$z = $x === $y; valoarea variabilei z va fi false, pentru că, deşi variabilele $x şi $y au aceeaşi valoare, tipurile lor diferă.
Operatorii logici
Operatorii logici se folosesc pentru operaţii de algebră logice. Cel mai des se pot întâlni în combinaţie cu operatorii de comparaţie, unde se folosesc pentru executarea comparaţiilor complexe cu mai multe variabile. Operatorii logicii returnează ca rezultat o valoare Boolean. Aceşti operatori leagă mai multe expresii dacă este îndeplinită o anumită condiţie şi, de asemenea, dau o valoare de tip Boolean:
prima expresie && a doua expresie – dacă ambele expresii sunt corecte, rezultatul este true (adevărat); prima expresie || a doua expresie – dacă prima sau a doua expresie este corectă, rezultatul este true (adevărat); semnul negaţiei ! valoare sau expresie - converteşte operandul în valoare Boolean şi apoi execută negaţia acestuia.
Conjuncţia logică (&&) Operatorul && (logic AND) execută o conjuncţie logică pentru doi operanzi. Aceasta înseamnă că valoarea returnată va fi true numai dacă ambii operanzi au valoarea true. Totuşi, mai trebuie menţionat că este suficient ca un singur operand să aibă valoarea false ca rezultatul să fie false. Exemple generale: $a1 = true && true; //Variabila a1 obţine valoarea true $a2 = true && false; //Variabila a2 obţine valoarea false $a3 = false && true; //Variabila a3 obţine valoarea false $a4 = false && false; //Variabila a4 obţine valoarea false În loc de valori logice, putem folosi şi expresii: 1$a1 =
(3 > 0) && (3 < 5);
// Variable a1 gets value true
De exemplu, dacă am fi dorit să verificăm dacă un utilizator are peste 13 ani şi mai puţin de 25 de ani, am fi scris: 1$user_age = 20; 2if($user_age>13 && $user_age<25) echo "User is younger than 25 and older than 13 years"; 3 În acest caz, textul: "User is younger than 25 and older than 13 years" s-ar fi scris pe pagină. Pentru o verificare, trebuie să schimbaţi valoarea variabilei user_age şi să mai verificaţi şi comportamentul programului. Disjuncţia logică (||)
Operatorul || (logic OR) execută disjuncţia logică pentru doi operanzi. Ca şi operatorul precedent (&&), şi operatorul || este binar, ceea ce înseamnă că manipulează doi operanzi. Returnează valoarea logică true, dacă cel puţin unul dintre operanzi returnează true: $o1 = true || true; // Variabila o1 obţine valoarea true $o2 = false || true; // Variabila o2 obţine valoarea true $o3 = true || false; // Variabila o3 obţine valoarea true $o4 = false || false; // Variabila o4 obţine valoarea false Am putea să verificăm dacă utilizatorul are 13 sau 25 de ani, însă în acest caz ar trebui să folosim operatorul logic OR/SAU (||): 1$user_age = 13; 2if($user_age==13 || $user_age==25) echo "User is 13 or 25 years old"; 3 De asemenea, putem să şi combinăm aceşti operatori: 1$user_age = 13; 2$user_gender = "male"; 3if(($user_age == 13 || $user_age == 25) && ($user_gender == "male")){ echo "Valid user"; 4 } 5
Negaţia logică (!) Spre dosebire de cei doi operatori menţionaţi mai devreme, acest operator nu este binar, ci unar. Deci, pentru operaţiile sale nu foloseşte doi, ci un singur operand. Operandul poate fi o valoare logică sau o expresie. Scopul acestui operator este inversarea operandului logic lângă care se află: $n1 = !true; // Variabila n1 obţine valoarea false $n2 = !false; // Valoarea n2 obţine valoarea true Mai multe informaţii interesante: Dacă operatorul ! este introdus lângă un operand care nu este o valoare logică, operatorul va converti mai întâi operandul în valoarea logică corespunzătoare, iar apoi va executa negaţia valorii respective. Aceasta ne indică faptul că o valoare care nu e logică se poate converti într-una logică prin executarea asupra acesteia a unei negaţii dublă (!!x). De exemplu: 1$x = 10; 2$x = !!$x; Acum, variabila x a devenit o valoare Boolean care este true:
Operator and or xor
Denumire And Or Xor
Exemplu $x and $y $x or $y $x xor $y
&& || !
And Or Not
$x && $y $x || $y !$x
Rezultat Este true dacă şi variabila $x, şi variabila $y sunt true. Este true dacă cel puţin o variabilă este true. Este true dacă una sau cealaltă variabilă este true, dar nu şi dacă ambele sunt true. Este true dacă şi variabila $x, şi variabila $y sunt true. Este true dacă cel puţin o variabilă este true. Este true dacă $x este false sau este false dacă variabila $x este true.
Tabelul 4.2 Este bine să ştiţi că PHP întotdeauna încearcă să trateze optim orice comparaţie. De exemplu, dacă scriem următoarele: if($a==10 || $b==20)... variabila $a are valoarea 10, iar comparaţiile nu vor fi executate (deoarece nu este necesar). Pe de altă parte, dacă în următorul cod: if($a==10 && $b==20)... variabila $a nu are valoarea 10, verificarea va fi întreruptă momentan, deoarece condiţia nu poate fi îndeplinită. Operatorii la nivel de bit (operaţii cu biţi) Fiindcă cea mai mică unitate care poate fi manipulată în PHP este byte-ul, PHP permite ca anumiţi operatori să poată fi manipulaţi prin valori la nivel de bit. Aceştia sunt operatorii shift şi operatorii OR, AND şi XOR. Operatorii shift (<< şi >>) permit mutarea biţilor în stânga sau în dreapta, în interiorul unui byte. De exemplu: 1$a=10; 2$b=$a<<1; Valoarea variabilei $a este 10. În scrierea binară, aceasta va fi numărul: 1010. Când valoarea $a<<1 este atribuită variabilei $b, toţi biţii din variabila $a sunt mutaţi cu un loc spre stânga, iar această valoare nouă este atribuită variabilei $b. Acum, această valoare este 10100 (sau dacă vă este mai simplu: 00010100 sau 0000000000010100). Valoarea variabilei $b va fi acum 10100 sau 20.
Dacă doriţi să vedeţi reprezentarea binară a numărului, este bine să utilizaţi funcţia printf şi să formataţi ieşirea binară a valorii: 1printf("%b",$b); Operatorul binar NOT (complement) (~) este operatorul care inversează conţinutul de biţi al variabilei curente. Dacă valoarea binară a variabilei a fost 1010, acum aceasta va fi 0101. Respectiv, 11111111111111111111111111110101, ceea ce puteţi încerca prin următorul exemplu: 1$a=10; 2printf("%b",~$a); Operatorul binar AND (&) dă o valoare nouă ca rezultat. Această valoare se obţine prin compararea biţilor care se află pe aceeaşi poziţie în ambii operanzi. Dacă cei doi biţi comparaţi au valori diferite sau valoarea 0, rezultatul va fi 0. Numai dacă cei doi biţi au valoarea 1, rezultatul va fi 1. De exemplu: 0101 & 1011 este 0001 Operatorul binar OR (|) oferă, de asemenea, o valoare nouă ca rezultat. Dar, în acest caz, această valoare este alcătuită din toţi biţii, unde măcar una dintre valorile comparate are valoarea 1. De exemplu: 0101 | 1011 este 1111 Operatorul binar XOR (eXclusive OR) (^). Acest operator ia în considerare numai biţii în care oricare dintre cele două variabile are valoarea 1, dar nu şi dacă ambele variabile au această valoare. 1010 ^ 1000 este 0010
Operatorul error suppression (supresorul erorilor)
Acesta este un operator simplu, care împiedică emiterea erorii cauzate de comanda pe care o precede. Încercaţi să executaţi în codul dvs. următoarea comandă (cu condiţia ca într-adevăr să nu aveţi fişierul "abcd" în folderul în care se află fişierul PHP): include "abcd"; Dacă încercaţi să executaţi această comandă, PHP va semnala o eroare, dar, dacă adăugaţi operatorul @ la această comandă: @include "abcd"; eroarea nu va fi emisă. Cât de eficient este acest lucru depinde de situaţia în care vă aflaţi. Uneori, dacă eroarea nu este emisă, acest lucru are o semnificaţie aparte, dar uneori poate şi să cauzeze dificultăţi.
Operatorul Backtick (ghilimele înclinate) Permite executarea unei comenzi de sistem şi emiterea ieşirii ei într-o variabilă: echo `dir`; Dacă încercaţi să executaţi acest exemplu, pe pagină va fi emis conţinutul folderului care conţine aplicaţia dvs. PHP. După cum am menţionat deja într-una din lecţiile anterioare, la sfârşitul anul 2015 se aşteaptă lansarea noii versiuni de PHP, cu marcajul PHP7. Tocmai această versiune de PHP aduce şi doi operatori noi. Este vorba de operatorul spaceship (sau operatorul comparaţiei combinate) şi operatorul null coalesce.
Operatorul spaceship Semnul pentru acest operator este următorul: <=> Este vorba de un operator care foloseşte doi operanzi şi se foloseşte pentru comparaţia acestora doi. Dacă am fi vrut să comparăm variabilele $a şi $b cu operatorul, am fi scris următoarele: $a <=> $b Pentru ca exemplul să fie mai evident, scriem următoarele:
1$a = 5; 2$b = 10; 3$z = $a <=> $b; În acest caz, valoarea variabilei $z ar fi -1. Spaceship returnează valoarea -1, în caz că primul operand este mai mic decât al doilea operand. În caz că ambii operanzi au aceeaşi valoare, rezultatul returnat va fi 0. La final, dacă primul operand ar fi fost mai mare decât al doilea operand, ca rezultat s-ar fi returnat numărul 1. Mai multe informaţii interesante Operatorul Spaceship reprezintă, de fapt, o formă prescurtată a următoarei expresii: ($a < $b) ? -1 : (($a > $b) ? 1 : 0) Deoarece pentru înţelegerea acestei expresii trebuie să cunoaşteţi operatorul ternar despre care vom vorbi mai târziu, aici vom da doar o scurtă explicaţie. Exemplul dat reprezintă un cod care se poate scrie în versiunile de PHP înainte de versiunea 7 şi în care va funcţiona perfect. În primul rând, acest cod verifică dacă primul operand este mai mic decât al doilea şi, dacă este mai mic, atunci returnează valoarea -1 (ceea ce şi face operatorul spaceship). Dacă nu acesta este cazul, se trece la partea alternativă a codului, în care se verifică dacă primul operand este mai mare. Dacă este îndeplinită această condiţie, se va returna valoarea 1. Dacă nici această condiţie nu este îndeplinită, este clar că operanzii sunt egali, aşadar ca rezultat va fi returnat numărul 0.
Operatorul null coalesce Semnul pentru operatorul null coalesce este următorul: ?? Scopul acestui operator este să verifice dacă variabila posedă o valoare utilă, iar pe baza acestui test atribuie variabilei noastre respectiva valoare utilă sau o altă valoarea subînţeleasă. Pentru a vă explica cât mai bine acest operator, imaginaţi-vă următoarea situaţie: dorim să atribuim variabilei $a valoarea pe care o are variabila $b, dar nu suntem siguri dacă există variabila $b. În caz că există, vrem valoarea ei, iar în caz că nu există această variabilă, vrem ca variabila noastră $a să obţină o valoare implicită, de exemplu 10. Utilizând operatorul coalesce, am putea să scriem următoarele: 1$a = $b ?? 10;
Mai multe informaţii interesante Şi acest operator, la fel ca şi spaceship, despre care am vorbit, reprezintă, de fapt, o sintaxă prescurtată care exista şi în trecut. De fapt, funcţia acestui operator am putea să o exectăm şi în mod tradiţional, dacă scriem următoarele: $a = isset($b) ? $b : 10; Şi aici putem vedea utilizarea operatorului ternar despre care vom vorbi mai târziu.
Formatarea diferitelor tipuri de reprezentări numerice Deseori, este necesar să reprezentăm anumite valori numerice într-un anumit format. De exemplu, dacă aceste valori numerice reprezintă sume de bani, atunci este necesar să fie reprezentate cu două spaţii zecimale, iar miile să fie despărţite prin virgulă. Pentru a reprezenta un număr într-un anumit format, utilizaţi funcţia: number_format(număr,numărZecimal,"separatorZeci","separatorMii") Argumentele acestei funcţii sunt în ordinea următoare:
număr - numărul care se formatează. Acest argument este obligatoriu; numărZecimal - numărul din spaţiile zecimale. Dacă acesta este omis, se subînţelege că numărul din spaţiile zecimale este 0. Trebuie neapărat să fie specificat dacă se folosesc argumentele separatorZeci şi separatorMii; separatorZeci - caracter folosit pentru separarea părţii zecimale a numărului. Separatorul implicit este punctul; separatorMii - caracter folosit pentru separarea miilor. Separatorul implicit este virgula.
După formatare, numărul se converteşte în string. De aceea, este necesar să executăm toate operaţiile aritmetice asupra numărului, înainte ca acesta să fie formatat. Pentru formatările mai complicate ale numerelor, se pot utiliza funcţiile printf() şi sprintf(). Funcţia printf() doar prezintă numărul într-un anumit format. Funcţia sprintf() formatează numărul şi îl stochează într-o variabilă. Aceste funcţii se folosesc şi pentru formatarea valorilor string.
Exemple Să creăm un program care adună două numere: Exemplul 1
1 2 12 Rezultatul din browser ar trebui să fie numărul 3. Comentariile explică clar ce se întâmplă în acest exemplu. Nu trebuie să uităm că convenţiile limbajului PHP sunt valabile numai în interiorul tagului PHP. De aceea, nu trebuie să încercăm executarea comenzii sau scrierea comentariilor în partea care se află în afara acestor taguri.
Exemplul 2 În acest exemplu, vom calcula aria cercului. Ştim că pentru aceasta avem nevoie de variabila r. De asemenea, pentru calcul, vom avea nevoie şi de numărul PI. Fiindcă este vorba de o valoare fixă, putem utiliza constanta. 1 2 10 Acest program, deşi scurt, conţine câteva lucruri foarte interesante, în primul rând definirea constantei. Procedura este destul de clară, funcţia define acceptă doi parametri (numele constantei şi valoarea constantei). În acest mod, obţinem definiţia constantei: define("PI", 3.14);
În loc de PI, puteam utiliza orice alt nume (din cadrul convenţiilor referitoare la numele variabilelor). Pentru definirea constantei, nu suntem limitaţi numai la valori numerice. Constanta poate purta orice tip de dată. 1define("nameSurname", "Peter Andersen"); // string 2define("age", 1980); //integer 3define("male", true); //boolean În continuarea programului, după iniţializarea variabilei r, observăm că la iniţializarea variabilei p o parte a expresiei este separată prin paranteze, iar constanta PI nu are semnul $ în faţa numelui. Acest lucru este normal, deoarece constantele nu trebuie să aibă marcajul $ în faţa numelui, în timp ce parantezele se folosesc pentru separarea logică a unităţilor pe parcursul operaţiei aritmetice. De exemplu, următoarele două linii de cod nu vor produce aceleaşi rezultate: 1echo 2-(3*3); 2echo (2-3)*3; La final, în ultima linie, programul pur şi simplu emite rezultatul la ieşire. Trebuie menţionat că în acest program rădăcina pătrată nu trebuie calculată manual, ci putem utiliza o funcţie care serveşte acestui scop, din colecţia funcţiilor pentru lucrul cu operaţiile matematice: 1pow($r,2); unde primul număr este valoarea de intrare, iar al doilea este exponentul. Rolul operatorului Error suppression este: împiedicarea emiterii erorii cauzate de comanda pe care o precede permiterea emiterii erorii cauzate de comanda pe care o precede afişarea mesajului de eroare atunci când se pune după comanda echo
Exerciţiul nr. 1 Trebuie să se refacă următoarea aplicaţie, altfel încât rezultatul să fie un număr alcătuit din două zecimale: 1
6 Rezultatul curent al aplicaţiei este: 448.2526
Rezolvare: 1 6 Observaţi că în stabilirea sarcinii în linia 5 se află: echo $pricewithdiscount; Această expresie ne-ar prezenta pe document valoarea variabilei: $pricewithdiscount, fără niciun fel de formatare, respectiv cu numărul total de zecimale, care în cazul nostru sunt 4. Cum la ieşire vrem să prezentăm numărul cu două zecimale, în primul rând trebuie să formatăm numărul. În acest scop, folosim funcţia number_format(). Această funcţie poate să accepte cel mult 4 parametri. Primul parametru este numărul care se formatează, cu al doilea parametru se determină numărul de zecimale, în timp ce al treilea parametru string va fi folosit pentru pentru separarea părţii zecimale a numărului. La final, avem posibilitatea să definim parametrul 4, care reprezintă stringul pentru separarea miilor. Primul parametru este obligatoriu, în timp ce celelalte sunt opţionale. Pentru cererile sarcinii noastre este suficient să se definească doi parametri, respectiv numărul care se formatează şi numărul de zecimale. De aceea, schimbăm linia 5 şi înainte de scriere facem formatarea în felul următor: echo number_format($pricewithdiscount,2) Exerciţiul nr. 2 Aplicaţia trece prin numerele de la 0 la 1000. Trebuie reprezentate doar numerele care se împart la trei, fără rest. Codul existent arată astfel: 1"; 4 ?> 5
)
Rezolvare: Se poate utiliza operatorul modulo: 1"; 4 ?> 5 Acest exerciţiu este destinat în primul rând cursanţilor care au ceva cunoştinţe în domeniul programării în orice limbaj. De aceea, vom explica pe scurt a doua şi a treia linie de cod, dar de această sintaxă ne vom ocupa în detaliu în modulul următor, aşadar vă puteţi întoarce la acest exemplu şi după lecţiile din modulul 2. Deşi accentul acestei sarcini este pus pe definirea condiţiilor cu ajutorului operatorilor abordaţi în lecţie, în câteva cuvinte vom explica for şi if, respectiv liniile 2 şi 3. Pe linia doi se află bucla for, cu care se asigură executarea următoarei linii de cod (linia codului) de 1000 de ori. De asemenea, în fiecare din aceste executări se poate folosi variabila $i, care de fiecare dată va avea valoare mărită cu 1. Asta înseamnă că la prima executare a buclei variabilei $i va avea valoarea 0, apoi 1, 2 etc. La fiecare executare a buclei, se verifică condiţia definită în paranteză după if în linia 3. Aici trebuie pusă expresia care va prezenta condiţia definită cu ajutorul operatorilor abordaţi în această lecţie. Dacă condiţia este îndeplinită, respectiv dacă este returnată valoarea true, se va executa şi următoarea linie de cod (linia 4). Cu a patra linie se asigură prezentarea culorilor care corespund valorii variabilei $i. Acum, putem să prezentăm condiţia definită între paranteze. În primul rând, verificăm dacă valoarea care corespunde variabilei $i este 3. În acest scop, folosim operatorul modulo care returnează valoare numerică prezentând restul după împărţire. Dacă după împărţire avem restul 0, înseamnă că numărul se împarte cu 3, fapt care se şi cere în exerciţiu. Pentru ca în şirul de soluţii să nu fie prezentat şi zero, mai facem o testare, respectiv verificăm dacă numărul $i este diferit de 0. Este important ca ambele condiţii să fie îndeplinite, aşadar din acest motiv între două condiţionări setăm AND (&&) logic. Astfel, condiţiile noastre sunt verificate, iar exerciţiul este gata. ………………………
Modul 2 Controlul fluxului
Instrucţiunile de ramificare În această lecţie, ne vom ocupa de instrucţiunile de ramificare. Structurile de gestionare permit manipularea în timpul executării programului. Pe baza structurii lor, le vom grupa în instrucţiuni de ramificare sau condiţionale şi în instrucţiuni repetitive, dar care reprezintă
bucle de programare. Dacă vreţi ca procesarea datelor pe care le-a introdus utilizatorul să aibă sens mai târziu, codul dvs. trebuie să ia anumite decizii. Instrucţiunile dintr-un cod se execută predominant în ordinea în care sunt scrise. Uneori, este însă necesar să schimbăm fluxul executării programului. Instrucţiunile de ramificare se utilizează în cazurile în care (dacă condiţia este îndeplinită) trebuie să executăm o parte sau alta a codului. Ramificarea condiţionată - if Prima şi totodată instrucţiunea de ramificare de bază este if. Această instrucţiune este cunoscută în aproape toate limbajele chiar aşa cum se numeşte: „dacă”. Deoarece cuvântul „dacă” retoric nu prea are o anumită logică, aşa nu îl are nici în programare, ci pe lângă acest cuvânt mai trebuie introdusă o anumită condiţie de care va depinde rezultatul acestei instrucţiuni:
5.1 - Schema if După cum putem vedea în schema de mai sus, programul se execută până ce ajunge la partea care provoacă ramificarea (if), unde verifică condiţia. Dacă condiţia este îndeplinită (true), se execută codul definit (if code). Dacă condiţia nu este îndeplinită (false), atunci va fi omis if code (nu se va executa), ci se continuă cu încărcarea paginii. if-else se poate deplasa de la condiţia de bază, cea minimă:
if (conditie) instructiune; care reprezintă doar o condiţie care trebuie îndeplinită pentru executarea unei anumite instrucţiuni. Prin posibilităţile soluţiei alternative: if (conditie) { instructiune } else { instructiune2 }; deseori se va întâmpla să trebuiască să se ia de dinainte decizia dacă o anumită acţiune se va executa, însă este mai important să se determine ce grup, din mai multe acţiuni oferite, va trebui să se execute exact la momentul dat. Când este vorba de o astfel de problemă, folosim instrucţiunea else în continuarea instrucţiunii condiţionate if. Instrucţiunea else se execută dacă condiţia nu este îndeplinită.
5.2 - Schema if else Deci, dacă condiţia este îndeplinită (true), se va executa blocul if din cod (if code) şi se va omite blocul alternativ (else code). Pe de altă parte, dacă condiţia nu este îndeplinită (false), imediat se trece la blocul de cod alternativ (else code), aşadar blocul de cod if (if code) este omis. Să vedem sintaxa acestei scheme: if (conditia care se testeaza) { blocul de cod care va fi executat daca conditia este indeplinita }else{
blocul de cod alternativ } După cum vedeţi, după închiderea blocului de cod if (paranteza acoladă închisă } ), inserăm cuvântul-cheie else, după care este definit blocul de cod alternativ. Iată cum arată condiţionarea în practică. De exemplu, avem o variabilă $x cu valoarea 10. Dacă vrem să afişăm un mesaj doar atunci când variabila $x are valoarea 10, scriem următoarele: 1$x=10; 2if($x==10) echo "x is 10"; Notă: După cum puteţi vedea în exemplul anterior, după verificarea condiţiei (care a returnat true), trebuie executată o singură linie de cod (această linie de cod nu trebuie neapărat introdusă în paranteze acolade). Aceasta înseamnă că acelaşi exemplu s-ar putea scrie şi în felul următor: $x=10; if($x==10){ echo "x is 10"; }
Instrucţiunile if...elseif....else Această instrucţiune are, în general, următoarea sintaxă: if (conditie1) { instructiune 1 } elseif (conditie2) { instructiune 2 } else { instructiune 3 }
5.3 - Schema if elseif Vom explica comportamentul acestei structuri. În primul rând, se verifică prima condiţie şi, dacă această condiţie este îndeplinită, atunci se execută code block 1, după aceea se părăseşte structura. Numai dacă prima condiţie nu este îndeplinită, se trece la testarea condiţiei 2. Dacă a doua condiţie este îndeplinită, atunci se execută blocul acesteia şi se părăseşte structura. Acelaşi lucru se repetă şi pentru a treia condiţie. La sfârşit, în caz că niciuna dintre condţii nu este îndeplinită, se execută blocul de cod alternativ (else). Iată în ce fel am putea să scriem aceasta: if (prima conditie) { blocul de cod care se executa daca prima conditie este indeplinita }elseif(a doua conditie){ blocul de cod care se executa daca a doua conditie este indeplinita }elseif(a treia conditie){ blocul de cod care se executa daca a treia conditie este indeplinita }else{
blocul de cod alternativ care se executa daca niciuna dintre conditii nu este indeplinita } În cadrul unei structuri if...else, pot exista mai multe blocuri elseif. Dacă câteva condiţii sunt adevărate (true), se va executa doar prima dintre ele. Este evident că ceea ce manipulează mecanismul de condiţionare este un tip Boolen, aşadar este clar că în expresie nu se poate insera ceva care ca rezultat nu are acest tip. Totuşi, dacă vă mai amintiţi de ceea ce am vorbit în lecţiile anterioare, am spus că PHP este capabil să convertească implicit tipurile, aşadar, chiar şi dacă expresia condiţiei este doar un număr sau o operaţie aritmetică, PHP va fi capabil să interpreteze şi aceasta în mod adecvat şi să pună o condiţie. Cuvântul elseif îl puteţi scrie împreunat sau separat (else if), deoarece ambele forme sunt corecte. În cadrul exemplelor, veţi întâlni ambele moduri de scriere. Când folosiţi acest tip de scriere a codului, trebuie să ţineţi cont că doar un bloc (o instrucţiune care este stabilită după condiţie) va fi executată. Condiţiile se pot exclude reciproc (doar una poate fi executată dintre toate cele specificate), însă, dacă condiţiile sunt în aşa fel încât mai multe trebuie să fie îndeplinite simultan, se execută doar o instrucţiune sau un bloc de instrucţiuni după prima condiţie îndeplinită. Condiţii încorporate Din punct de vedere semantic, plasarea valorii numerice în expresia condiţiei nu este corectă, motiv pentru care trebuie evitată. De exemplu, următorul exemplu este corect din punct de vedere al funcţionalităţii programului, dar în practică ar fi mai bine ca cifra 10 să nu fie o cifră, ci o variabilă. 1 2 12 Expresiile de ramificare se pot insera şi unele în cadrul altora, respectiv se pot încorpora în ele însele. De exemplu: 1if(true) if(true) 2 echo "This line of code is executed";
3 Acest exemplu (complet funcţional), pe lângă faptul că reprezintă o situaţie de condiţii încorporate, reprezintă, de asemenea, şi un alt mod de utilizare a acestui operator: un corp fără paranteze acolade. Această abordare este posibilă numai dacă respectivul corp subînţelege o singură linie de cod. Dacă există mai multe linii (cel puţin două), atunci parantezele acolade sunt obligatorii, altfel pot apărea nereguli logice în funcţionarea aplicaţiei. Să privim exemplul: 1if (true) echo "This line of code depends of condition
"; 2 echo "This line of code will be executed in any case"; 3 A doua linie va fi executată indiferent de situaţie. Ceea ce în exemplu este o problemă banală, într-o aplicaţie serioasă poate duce la erori grave. Se recomandă folosirea parantezelor acolade chiar şi atunci când aveţi o singură instrucţiune după bloc, asta ca să fiţi siguri că instrucţiunea dvs. aparţine tocmai condiţiei respective. Abordarea scrierii blocurilor condiţionate fără paranteze acolade se poate întâlni şi la alte structuri pentru controlul fluxului, însă nu şi în funcţii sau clase. În afară de aceasta, de obicei ceea ce v-aţi imaginat ca o linie (condiţionată) de cod se va transforma în mai multe linii, aşadar cel mai bine ar fi să folosiţi paranteze acolade când manipulaţi fluxul. Când apare nevoia de anumite operaţii logice mai complexe, există posibilitatea de localizare a unei instrucţiuni if în alte instrucţiuni: if (conditie1){ bloc de cod1; }else{ if (conditie2){ bloc de cod 2; }else{ bloc de cod 3; } } Vom analiza acum acest caz. Dacă condiţia1 este îndeplinită, se va executa blocul de cod 1. Dacă condiţia nu este îndeplinită, ramificarea externă trece la blocul de cod else în care se găseşte ramificarea internă. Dacă este îndeplinită condiţia2, scrisă în ramificarea internă, se va executa blocul de cod 2. Dacă nici această condiţie nu este îndeplinită, atunci se execută blocul de cod 3. Uneori, pentru condiţionare se foloseşte şi operatorul ternar. Acest operator se foloseşte predominant pentru atribuirea valorii condiţionate şi nu conţine blocuri de cod, ceea ce înseamnă
că nu este o structură potrivită pentru controlul fluxului, ci este mai degrabă un operator de atribuire. Cu toate acestea, valoarea este atribuită în mod condiţionat, motiv pentru care acest operator influenţează fluxul aplicaţiei. 1$b = ( $a == 0 ) ? 10 : $a; Operatorul ternar este alcătuit din patru părţi:
Variabila căreia îi este acordată o valoare ($b); Condiţia ($a==0); Valoarea care se acordă dacă condiţia este îndeplinită (10); Valoarea care se acordă dacă condiţia nu este îndeplinită ($a).
Să presupunem că undeva în cod există variabila $a care are valoarea zero. Atunci când este activat operatorul ternar, i-am spus de fapt programului să verifice o anumită condiţie şi i-am dat alternativele pentru ambele rezultate posibile ale acestei condiţii: ? rezultat 1, în cazul în care condiţia este îndeplinită, şi : rezultat 2, în cazul în care aceasta nu este îndeplinită. Operatorul ternar, din exemplul de mai sus, reprezintă alternativa unei structuri if, precum cea de mai jos: 1if($a == 0){ 2 $b = 10; 3}else{ $b = $a; 4 } 5 În exemplul care urmează, în primul rând se definesc trei variabile (day, month, year), care conţin informaţii referitoare la dată. Ulterior, se foloseşte funcţia checkdate() pentru verificarea valabilităţii datei. Prin ramificarea codului, determinăm ce mesaj va fi afişat pe pagină: 1 2 $day = 15; $month = 2; 3 $year = 2013; 4 5 $result = checkdate( $month, $day, $year); 6 7 if ($result == true) 8 { echo "Date is correct."; 9 } 10 else 11 { 12 echo "Date is incorrect."; } 13 14
Notă: Deoarece în paranteza de după cuvântul-cheie if se aşteaptă valoarea Boolean, aceasta nu trebuie să apară drept consecinţă a comparaţiei, ci poate fi scrisă ca o valoare concretă. Astfel, în exemplul precedent, în loc de expresia: $result == true am putut să scriem: $result
În cele din urmă, iată şi cea mai frecventă eroare în crearea blocurilor condiţionate. Utilizarea operatorului de atribuire (=) în locul operatorului de comparaţie (==): 1$a = 10; 2if($a = 5){ 3 echo "Test."; 4} Executarea acestui cod va duce la câteva consecinţe cruciale pentru executarea programului, din cauza inserării operatorului de atribuire în locul operatorului de comparaţie:
În condiţie, variabila $a va primi valoarea 5, pe care o va reţine pe parcursul derulării programului, ceea ce probabil nu dorim să se întâmple; Într-o expresie condiţionată, după atribuirea valorii pentru variabila $a, aceasta va avea valoarea 5. După cum am şi spus în lecţiile precedente, toate valorile număr întreg (integer), în afară de zero, devin true atunci când se transformă în tip Boolean, chiar dacă sunt negative. Singura situaţie în care integer se transformă în Boolean false este atunci când integer este zero. În cazul numărului 5, se obţine true şi astfel această condiţie va fi îndeplinită întotdeauna, indiferent de ce am face noi cu acest program, înainte sau după această condiţie.
Dacă scrieţi următoarele: »else if« în loc de »elseif«, programul va semnala o eroare? Programul nu va semnala eroare, deoarece ambele instrucţiuni sunt corecte din punct de vedere sintactic. Programul va semnala eroare, deoarece instrucţiunile nu sunt corecte din punct de vedere sintactic.
Exerciţiul nr. 1
Pe pagină există variabila $page. În variabilă, este permisă existenţa uneia din două valori pe baza cărora va fi încărcată pagina. Cele două valori sunt "index" şi "products". Dacă valoarea este "index", se încarcă pagina index.html, dacă valoarea este "products", se încarcă pagina products.html. Dacă nicio valoare nu coincide cu valoarea solicitată, se încarcă pagina login.html. Rezolvare: 1 2 11 Ca să rezolvăm acest exercițiu, în primul rând definim variabila care va prezenta stringul pe care îl testăm. În cazul nostru, aceasta este variabila $page aflată pe a doua linie de cod. În aceeaşi linie, atribuim valoare acestei variabile, care iniţial este index. Apoi, folosim structura if, else if, else pentru a prelucra fiecare scenariu care ne interesează aşa cum este definit în exerciţiu. În primul rând, setăm if şi verificăm dacă $page este la fel ca şi "index": 1if( $page == "index" ){ Dacă această condiţie va fi îndeplinită, pe pagină va apărea textul: index.html. Dacă această primă condiţie nu este îndeplinită, trebuie să o verificăm pe următoarea. Pentru asta folosim else if: 1elseif( $page == "products" ) Astfel, verificăm dacă valoarea variabilei $page este la fel ca şi "products". Dacă niciuna dintre cele două condiţii nu este îndeplinită, se va executa else block: 1else{ 2 $page = "login.html"; 3 4 5 }
şi pe pagină va apărea textul: login.html, care este cerinţa exerciţiului. Cu aceasta am terminat exercițiul, dar, dacă vreţi să verificaţi dacă este complet funcţional, încercaţi să schimbaţi valoarea iniţială pentru variabila: $page, după care verificaţi prezentarea pe pagină. Exerciţiul nr. 2 În sistemul pentru monitorizarea autoturismelor, există patru statusuri ale autoturismelor: în staționare, în mişcare, dispărut, necunoscut. Aceste statusuri sunt marcate cu cifrele 1, 2, 3 şi 4. În aplicaţie, intră ultimul status cunoscut al autoturismului, precum şi statusul curent al acestuia. Statusurile respective intră în variabilele $lastStatus şi $status: $lastStatus = 2; $status = 4; Trebuie să se atribuie valoarea variabilei $statusName. Acest nume va conţine reprezentarea textuală a statusului autoturismului (în mişcare, în staționare, necunoscut etc.). Astfel, trebuie să se respecte următoarea regulă: dacă ultima stare a autoturismului a fost "în mişcare", iar noul status este "necunoscut", noua stare trebuie să fie "dispărut". Variabila $statusName trebuie emisă la ieşire. Rezolvare: 1 2 $lastStatus = 2; 3 $status = 4; 4 $statusName = "unknown"; 5 6 if($status == 1) $statusName = "stays"; 7 else if($status == 2) 8 $statusName = "moves"; 9 else if($status == 3) $statusName = "dissapear"; 10 11else if($status == 4) { 12 if($lastStatus == 2) 13 $statusName = "dissapear"; 14 else $statusName = "unknown"; 15 } 16 echo $statusName; 17 18
Rezolvarea acestui exerciţiu urmăreşte o structură similară cu cea precedentă, cu diferenţa că aici se cere ca executările condiţionate să fie puse una într-alta. Este menţionat că trebuie să se respecte următoarea regulă: „...dacă ultima stare a autoturismului a fost "în mişcare", iar noua stare este "necunoscut", noua stare trebuie să fie "dispărut"...". De aceea, la începutul codului care prezintă soluţia, definim variabilele care vor fi folosite mai departe. Apoi, imediat punem executarea condiţională definită prin definirea condiţiilor if şi trei else if. În fiecare condiţie, verificăm $status (1,2 şi 3). Aceste trei statusuri trebuie verificate, iar pe baza lor se definește imediat valoarea variabilei $statusName. Ca să respectăm cerinţa din exerciţiu pentru $status cu care este confirmată valoarea 4, facem o nouă verificare internă. Aici, ţinem cont de valoarea ultimului status, respectiv de valoarea variabilei: $lastStatus. Dacă ultimul status este 2, variabila $statusName va primi valoarea "dissapear", iar în caz contrar, "unknown". Astfel, am respectat toate cerinţele exerciţiului, iar testarea noastră este gata. Mai rămâne doar să prezentăm pe pagină valoarea nou creată, iar asta facem cu linia: 1echo $statusName; Exerciţiul nr. 3 Trebuie scris un program care permite utilizatorului să ghicească numărul definit în cod. De asemenea, pentru ca utilizatorul să ştie cât este de aproape de răspuns, anunţaţi-l cu un mesaj în cazul în care diferenţa dintre numărul ghicit şi cel real este mai mică de 10. Încercarea se introduce prin parametrul GET "number".
Rezolvare: 1 2 $secretNumber = 765; 3 if ($_GET['number'] == $secretNumber ) { 4 echo '
Congratulations!!!
'; 5 } 6 elseif( abs($_GET['number'] - $secretNumber) < 10 ) { 7 echo '
You are near to the result!!!
'; 8 } 9 else 10 { 11 echo '
Try again!!!
'; } 12 13 După cum este menţionat în cerinţă, trebuie să se folosească parametrii GET, aşadar pentru asta o să folosim parametrii GET, aşadar în primul rând o să vedem cum să definim parametrul GET şi cum să folosim valoarea sa în codul PHP. Parametrii GET fac parte din URL, de aceea se pot scrie pe URL-ul deja existent. Să zicem că codul pentru acest exemplu se află în fişierul
index.php aflat în următoarea locaţie: C:\wamp\www\test\index.php În acest caz, în căsuța de adrese a motorului de căutare am avea URL-ul cu următoarea structură: http://localhost/test/index.php Ca să împachetăm în acest URL parametrul GET numit "number", care are valoarea 760, pe URL-ul existent am scrie: 1?number=760 Deci, acum adresa completă ar arăta astfel: http://localhost/test/index.php?number=760 Dacă accesăm această adresă, PHP ar putea să recunoască parametrul GET cu numele "number". Acest parametru l-am putea accesa cu următoarea linie: 1$_GET['number'] Acum, putem să trecem la codul PHP pentru rezolvarea problemei. În primul rând, definim variabila $secretNumber, căreia îi atribuim valoarea pentru numărul solicitat (număr arbitrar). Imediat după asta verificăm dacă utilizatorul a nimerit numărul ascuns. Asta facem cu următorul cod: 1if ($_GET['number'] == $secretNumber ) 2 { echo '
Congratulations!!!
'; 3 } 4 Dacă utilizatorul nu a nimerit numărul, ar trebui să verifice dacă este pe aproape. Asta se face cu următorul cod: 1elseif( abs($_GET['number'] - $secretNumber) < 10 ) 2 { echo '
You are near to the result!!!
'; 3 } 4 Ca să avem o explicaţie adecvată şi în cazurile în care utilizatorul a trimis prin GET un număr mult mai mic decât cel căutat, în primul rând numărul trimis de către utilizator îl micşorăm cu valoarea numărului ascuns, apoi calculăm valoarea absolută a acestui rezultat. Astfel, nu putem să obţinem în rezultat un număr negativ. Valoarea absolută se calculează cu funcţia abs(), căreia îi atribuim ca parametru numărul a cărui valoarea absolută trebuie să o calculăm.
Dacă niciuna dintre aceste condiţii nu este îndeplinită, trebuie asigurat un bloc de cod alternativ, care se va executa în acest caz: 1else 2 { 3 } 4
echo '
Try again!!!
';
Cu aceasta am terminat exercițiul şi, modificând valoarea parametrului GET "number", putem să verificăm cum funcţionează logica creată. Exerciţiul nr. 4 La un magazin de mobilier de birou, proprietarii au stabilit reduceri în luna ianuarie pentru achiziţionarea scaunelor de birou, conform următoarelor reguli:
Pentru mai puţin de 10 scaune cumpărate – nu există reducere; Pentru 10 – 49 scaune cumpărate – reducere de 5%; Pentru 50 – 99 scaune cumpărate – reducere de 10%; Pentru 100 de scaune cumpărate sau mai multe – reducere de 15%. Trebuie scris codul de programare care, folosind structurile if else, va calcula reducerile în momentul achiziţionării. Recomandare: utilizaţi operatorul de conjuncţie ( &&).
Rezolvare: 1 2 $chairs = 10; 3 if ( $chairs < 10) 4 { 5 $discount = 0; 6 } elseif ( $chairs >= 10 && $chairs <= 49 ) 7 { 8 $discount = 5; 9 } 10elseif ( $chairs >= 50 && $chairs <= 99 ) 11{ $discount = 10; 12} 13elseif ( $chairs >= 100 ) 14{ 15$discount = 15; 16}echo $discount; 17 18
După cum am explicat mai devreme, în codul precedent este folosită instrucţiunea elseif cu condiţii care se exclud reciproc (doar una dintre condiţii poate fi îndeplinită). Deoarece ştim că nu există verificarea viitoarei condiţii în caz că cea precedentă este îndeplinită, acest exemplu se poate rezolva în felul următor: 1 2 $chairs = 100; 3 if ( $chairs < 10) 4 { 5 $discount = 0; 6 } elseif ( $chairs <= 49 ) 7 { 8 $discount = 5; 9 } 10elseif ( $chairs <= 99 ) 11{ $discount = 10; 12} 13elseif ( $chairs >= 100 ) 14{ 15$discount = 15; 16}echo $discount; 17 18 ………………………
Structura switch-case În această lecţie, ne vom ocupa de instrucţiunea switch şi vom explica structura switch-case. Instrucţiunea switch Modul de condiţionare if..elseif..else, de executare a unui cod este bun, însă nu prea elegant atunci când avem un număr mai mare de alternative elseif, aşadar pentru astfel de cazuri folosim o structură switch case mai clară. Cu alte cuvinte, am putea spune că această structură este ideală pentru testarea unei variabile sau declaraţii care poate avea mai multe valori aşteptate. Vom lua ca exemplu nevoia de testare a unei variabile în cod, care ar trebui să conţină numele zilelor din săptămână. Este clar că putem aştepta doar 7 valori. Reprezentarea grafică a structurii switch case s-ar putea ilustra în felul următor:
6.1 - Schema switch Să observăm următoarea sintaxă: 1 switch (expresie) { case valoare1: 2 //Blocul de cod care se va executa în caz că expresia şi valoare 1 3 coincid 4 break; //Cuvântul-cheie cu care se întrerupe executarea codului în 5 structura switch case valoare2: 6 //Blocul de cod care se va executa dacă expresia şi valoarea 2 coincid 7 break; 8 default: 9 //Blocul de cod care se va executa dacă nu există alte coincideri 10} În structura switch, mai întâi se calculează expresia, iar apoi valoarea rezultată se compară cu valorile specificate în marcajele case. Dacă valoarea expresiei este egală cu una dintre valorile din marcajul case, este executat grupul de instrucţiuni care urmează după acest marcaj. Dacă valoarea expresiei diferă de toate cele listate în case, este executat grupul de instrucţiuni care urmează după marcajul default.
Această structură poate fi înlocuită de o structură if...elseif...else, dar în unele cazuri switch...case este mai practic şi mai clar. De exemplu, în structura if-else, la fiecare verificare trebuie să plasaţi variabilele în expresia condiţionată. În switch-case, acest lucru nu este necesar. Pe de altă parte, la switch-case nu puteţi să schimbaţi variabila, ci doar expresiile acesteia. Mai mult, switch-case, deşi este destul de clară, nu este adecvată pentru blocuri de condiţii mari. De obicei, în ea sunt plasate acţiuni condiţionate sau funcţii scurte. Să analizăm un exemplu: 1 2 $x = 2; 3 switch( $x ){ case 1: 4 echo "x is one"; 5 break; case 2: 6 echo "x is two"; 7 break; 8 default: 9 echo "x is not one either two"; 10}<span style="font-size: 14px;"> 11 În exemplul de mai sus, am iniţializat mai întâi variabila $x, apoi am aşezat-o în structura switch. Structura switch subînţelege blocuri de condiţii mărginite cu paranteze acolade. Fiecare condiţie începe cu cuvântul-cheie case, urmat de valoarea condiţionată sau de condiţie şi două puncte care desemnează începutul blocului. Puteţi să puneţi acest bloc între paranteze acolade (nu este obligatoriu). Spre deosebire de blocurile de condiţii standard, în cazul blocurilor case va fi executat tot blocul condiţionat (nu doar primul rând). Mai mult, dacă la un moment dat condiţia este îndeplinită, se vor executa şi liniile care urmează, până când programul primeşte o directivă care-l înştiinţează să părăsească structura în totalitate sau să nu execute structura în întregime. 1 2$x = 1; switch( $x ){ 3 case 1: 4 echo "x is one"; case 2: 5 echo "x is two"; 6 default: 7 echo "x is not one either two"; 8}<span style="font-size: 14px;"> 9 Drept rezultat, acest cod va da, în PHP, toate cele trei instrucţiuni echo, tocmai pentru că nu există niciunde o ieşire din structură. Aceasta înseamnă că partea implicită a oricărui bloc case este şi comanda break (părăsirea necondiţionată a structurii). Totuşi, există şi cazuri când programatorul intenţionat nu vrea să insereze instrucţiunea break. Acestea sunt cazuri în care două sau mai multe valori ale expresiei trebuie să execute acelaşi bloc de cod.
Haideţi să analizăm următorul exemplu, care ilustrează tocmai cele explicate în rândurile de mai sus: 1 2 $x = 1; 3 switch( $x ){ case 1: 4 case 2: 5 echo "x is one or two"; 6 break; case 3: 7 case 4: 8 echo "x is three or four"; 9 break; 10 default: 11 echo "x is not either one, either two,either three, either four"; 12} 13 În ceea ce priveşte structura switch-case, PHP este foarte flexibil în comparaţie cu alte limbaje. În timp ce în alte limbaje aceste expresii sunt deseori limitate doar la valori de tip numere întregi, PHP poate accepta orice valoare în structură şi o poate procesa apoi corect prin intermediul cazurilor: //$d=3;
1 $d="Wed"; 2 switch ($d) 3 { 4 case "Mon": case 1: 5 echo "Today 6 break; 7 case "Tue": 8 case 2: echo "Today 9 break; 10case "Wed": 11case 3: 12 echo "Today 13 break; case "Thu": 14case 4: 15 echo "Today 16 break; 17case "Fri": 18case 5: echo "Today 19 break; 20case "Sat": 21case 6: 22 echo "Today break; 23case "Sun":
is Monday";
is Tuesday";
is Wednesday";
is Thursday";
is Friday";
is Saturday";
24case 7: 25 echo "Today is Sunday"; break; 26default: 27 echo "Wonder which day is this ?"; 28} 29 30 31 32 33 34 35 În afară de valorile scalare, cazurile pot accepta şi expresii întregi. De exemplu, putem verifica dacă o valoare este egală, mai mare sau mai mică decât cea de intrare: case: $a > 1... Putem verifica şi condiţiile din afara contextului: 1 2 $x = 7; 3 switch(true) { 4 case $x%2 == 0; 5 echo "x is divisible by 2"; 6 break; case $x%3 == 0: 7 echo "x is not divisible by 2, but it is divisible by 3"; 8 break; 9 default: 10 echo "x is not divisible by 2, either 3"; 11}<span style="font-size: 14px;"> 12 În condiţia case, putem pune de asemenea şi o funcţie: 1 $x = false; 2 switch(true) 3 { case is_int($x): 4 echo "x is a integer"; 5 break; case is_string($x): 6 echo "x is a string"; 7 break; 8 case is_bool($x): 9 echo "x is a boolean"; 10 break; } 11
12 13 Când este vorba de expresia case, puteţi utiliza variabile de tip integer, double şi string, în timp ce şirurile şi obiectele nu pot fi acceptate ca variabile de intrare dacă nu sunt marcate ca tipuri mai simple. Mai multe despre instrucţiunea break În toate exemplele de până acum, aţi putut vedea instrucţiunea break la finalul fiecărui bloc case. Cu următorul exemplu, vom explica principalul rol al instrucţiunii break în cadrul blocurilor de instrucţiuni switch-case: 1 2 $category = "news"; 3 switch ( $category) 4 { 5 case "news" : 6 echo '
News from the world ...
'; 7 break; 8 case "politics" : echo '
Politics...
'; 9 break; 10 case "sport" : 11 echo '
Last sport results ...
'; 12 break; 13 default : echo '
Welcome...
'; 14 } 15 16 Exemplul prezentat are cadre şi sintaxe standard, pe care le-am explicat deja. Bineînţeles, se subînţelege că variabila $category a fost declarată în partea precedentă a codului, lucru pe care lam şi făcut la începutul scriptului PHP: $category= "news";
La final, programul nostru va scrie: News from the world... O astfel de funcţionare a programului şi a structurii switch-case este posibilă tocmai datorită instrucţiunii break. Iată despre ce este vorba: În momentul executării, programul verifică blocurile pentru a vedea care dintre ele satisface valoarea variabilei $category. Când îl găseşte, întâlneşte şi instrucţiunea break şi opreşte
executarea în continuare a programului. Dacă am omite instrucţiunile break din codul precedent, scriptul nostru PHP ar avea următoarea structură: 1 2 $category= "news"; 3 switch ( $category ) 4 { 5 case "news" : 6 echo '
News from the world...
'; 7 case "politics" : echo '
Politics...
'; 8 case "sport" : 9 echo '
Last sport results ...
'; 10 default : 11 echo '
Welcome ...
'; 12 } 13 Fără break în cadrul blocurilor case, programul nostru execută toate blocurile case neglijând variabila condiţională switch. După executare, rezultatul final va fi: News from the world... Politics... Last sport results ... Welcome ... Instrucţiunea default La finalul fiecărei structuri switch-sase, se află instrucţiunea default. Când pornim programul, PHP încearcă să găsească unul dintre blocurile case care satisface în avans condiţia stabilită; în cazul în care niciuna dintre instrucţiunile condiţionale nu satisface criteriile prevăzute, are loc executarea instrucţiunii default. Pe scurt, comanda default este cea care se execută când niciuna nu este îndeplinită. Iată şi un exemplu concret: 1 $i = 5; // sample 2 switch ( $i ) { case 0: 3 echo "i is equal 0"; 4 break; 5 case 1: 6 echo "i is equal 1"; break; 7 case 2: 8 echo "i is equal 2"; 9 break; 10 default: echo "i is not equal 0, 1 either 2"; 11 } 12
13 14 După executarea programului, la final obţinem rezultatul: i is not equal 0, 1 either 2 ceea ce reprezintă tocmai instrucţiunea noastră default. Fiţi atenţi la faptul că poziţia cazurilor nu joacă niciun rol în fluxul structurii. Următorul exemplu va da acelaşi rezultat precum cel de mai devreme, deşi ordinea cazurilor este alta: 1 2 $i = 5; // sample 3 switch ( $i ) { default: 4 echo "i is not equal 0, 1 either 2"; 5 break; 6 case 1: 7 echo "i is equal 1"; break; 8 case 0: 9 echo "i is equal 0"; 10 break; 11 case 2: 12 echo "i is equal 2"; break; 13 } 14 15
Notă: Trebuie să ştiţi că versiunea PHP 5.7 permite utilizarea blocurile default multiple, unde doar ultimul bloc default s-ar fi executat fără probleme. Haideţi să vedem aceasta în următorul exemplu: 1
echo 'Case 1';
echo 'Case 2';
11 12 13 14 15 16 17 18 19 20 21} 22 23 24 25
case 3: echo 'Case 3'; break; default: echo 'Default 1'; break; default: echo 'Default 2'; break;
Rezultatul pe pagină ar fi fost: Default 2 În versiunea PHP7, nu mai există un astfel de comportament şi, dacă apar blocuri default multiple, se va genera o eroare.
Dacă omitem instrucţiunea break în cadrul blocurilor case: executăm toate blocurile case care urmează după coinciderea condiţiilor oprim programul va fi semnalată o eroare de sintaxă Pe scurt, instrucţiunea/cazul default reprezintă: cazul care se execută când nicio condiţie nu este îndeplinită cazul care se execută în orice caz, chiar dacă una dintre condiţii este îndeplinită cazul care nu va fi executat niciodată
Exemplul nr.1 Deseori, pe site-urile de vânzări întâlnim partea de completare a chestionarului "Cum aţi aflat de noi". Astfel de chestionare funcţionează prin intermediul structurii switch-case.
6.2 - Exemplu de formular "How did you find us?" Aspectul şi alegerea modului de conectare cu blocurile nu face parte din subiectul acestui curs şi din acest motiv nu vom crea pagini HTML cu meniuri derulante care conţin valorile variabilei noastre pentru condiţia switch. Acum, vom explica doar partea switch-case a scriptului PHP. Când setăm ca variabila noastră $way (pe care am declarat-o) să conţină valorile a, b, c... care ne servesc în continuare drept câmpuri selectate pe pagină, putem utiliza următorul cod: 1 2 $way = "b"; switch ($way){ 3 case "a": 4 echo '
Regular customer ...
'; 5 break; 6 case "b": 7 echo '
Customer has found us over the TV commercial....
'; break; 8 case "c": 9 echo '
Recommendation...
'; 10 break; 11 default : echo '
We don't know how customer found us...
'; 12 } 13 14
Pentru a observa funcţionarea programului, am atribuit variabilei $way valoarea "b" înaintea structurii switch-case, pentru a simula alegerea modului în care clientul a aflat despre noi. După execuţia programului, rezultatul va fi: Customer has found us over the TV commercial... Exemplul nr. 2 Din exemplul de mai jos, putem concluziona că în cadrul expresiei switch putem executa şi operaţii de un grad mai mic, precum, de exemplu, operaţia de mărire: 1 2 17 18 După executarea programului, la ieşire obţinem rezultatul: 1 ceea ce confirmă că operaţia în cadrul lui switch este executată şi că variabila care la început avea valoarea 0, după trecerea prin switch-case, a obţinut valoarea 1.
Exerciţiul nr. 1 Trebuie scris codul care va conţine cinci constante pentru zilele lucrătoare din săptămână (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY). De asemenea, codul trebuie să conţină partea care verifică constanta (ziua din săptămână) şi, pe baza ei, afişează descrierea zilei prin intermediul structurii switch-case. Dacă este luni, descrierea este "prima zi din săptămână" etc. Trebuie să se facă o testare a codului creat.
Rezolvare: 1 2 3 30 31 32 Prima cerere din această temă este crearea constantei. Să ne aducem aminte că constantele se creează cu ajutorul funcţiei define(). Primul parametru al acestei funcţii este numele constantei, în timp ce al doilea este valoarea ei. De asemenea, definim şi valoarea pentru variabila $day, cu care stabilim ziua din săptămână. Apoi, creăm switch şi între paranteze rotunde punem variabila pe care vrem să o testăm. Această variabilă va fi comparată cu valorile care sunt definite după case, până când are loc suprapunerea. Dacă aceasta nu are loc, se va executa default block al codului. La final, este suficient ca prin comanda echo să prezentăm valoarea pentru $description.
Exerciţiul nr. 2 Trebuie scris un cod care, pe baza variabilelor $operator, $operand1 şi $operand2, va executa operaţia de calcul şi va afişa rezultatul. În acest scop, trebuie să se folosească structura switch-case. Rezolvare: 1 2 3 23 24
= $operand1 + $operand2; = $operand1 - $operand2; = $operand1 * $operand2; = $operand1 / $operand2; = "Unknown result.";
Rezolvarea acestei probleme este foarte asemănătoare cu cea precedentă după structură. În primul rând, am creat trei variabile după cum este solicitat în enunţ şi le-am atribuit imediat valori. Acum, prin switch trebuie să verificăm ce valoare are variabila $operator, ca pe baza aceasta să putem executa operaţia de calcul corespunzătoare. Pentru fiecare dintre expresiile potenţiale, punem rezultatul în variabila $result. Dacă $operator string este cel care nu corespunde niciunei valori care este definită în switch, ca rezultat se ia string: „Unknown result“.
Exerciţiul nr. 3
Trebuie creat un program care îl va informa pe utilizator despre activităţile sale din timpul studierii unui curs. Se verifică numărul de accesări la o lecţie (de câte ori s-a deschis o lecţie) şi, pe baza aceasta, utilizatorul este informat despre începerea procesului de învăţare, despre testul pe modul şi despre finalizarea cursului. Se foloseşte structura switch-case. Trebuie definită şi variabila pentru numărul de intrări căreia i se atribuie valoarea 0, pentru a se putea face numărarea intrărilor în cod în continuare. Rezolvare: 1 2 15 La început, creăm variabila $numberOfEntries, care va prezenta numărul de intrări pe platforma pentru studiu. Pentru utilizator, vrem să generăm diferite mesaje pentru trei numere de intrări, şi anume: prima dată, după 20 şi după 30 de vizite. Folosim structura switch ca şi la exerciţiile precedente, dar de data aceasta nu avem default clock code. Notă: După terminarea tuturor exerciţiilor, se recomandă și testarea codului. Puteţi testa codul atribuind noi valori variabilelor declarate în cadrul exerciţiilor şi în acest fel puteţi verifica comportamentul structurilor switch-case şi cu alte expresii condiţionate …………………………………
Bucla for Unitate: 7 din 19 00:29:35 +Rezumat
Subiectul lecţiei este bucla for şi variaţiile acesteia. Regulile nescrise ale practicii bune de programare implică şi faptul că aceleaşi blocuri de cod nu ar trebui să se repete, adică să se copieze de mai multe ori. Totuşi, deseori trebuie să executăm repetitiv anumite blocuri de cod. Vom analiza acest caz practic: Am creat un bloc de cod prin care pe pagină este afişată o ştire. În momentul în care decidem să afişăm pe pagină 10 ştiri, avem situaţia în care acelaşi bloc de cod, sau unul similar, trebuie să-l copiem de 10 ori. Acest caz este cât de cât acceptabil, însă ce se întâmplă dacă avem situaţia în care un bloc de cod trebuie repetat de 100 de ori sau chiar şi situaţia în care nici măcar nu ştim de câte ori trebuie să se repete acelaşi bloc de cod? În astfel de situaţii, în ajutor ne vin buclele. În buclă, putem insera un anumit bloc de cod, iar bucla va executa blocul respectiv de câte ori este specificat. Fiecare trecere prin blocul de cod o numim iteraţie. PHP are câteva tipuri de bucle, dar, cu excepţia diverselor variaţiuni, numărul de bucle se reduce la două: buclele for şi while. În această lecţie, vom vorbi despre bucla for şi despre variaţia acesteia, foreach.
Bucla for Bucla for se utilizează atunci când ştim în prealabil cu exactitate de câte ori trebuie executat blocul de instrucţiuni. Această buclă are următoarea sintaxă: for (iniţializare; condiţie; incrementare) { bloc de instrucţiuni; }
Primul parametru se foloseşte pentru crearea şi pentru setarea valorii iniţiale a numărătorului/counter. Al doilea parametru conţine condiţia pentru counter, iar al treilea determină cum anume este incrementat counterul.
7.1- Schema for Chiar la început, bucla iniţializează variabila care va fi counter (deşi aici se pot iniţializa şi alte variabile). După aceea, se verifică condiţia. În cazul în care condiţia este îndeplinită, se va executa blocul de cod definit în corpul buclei. După executarea codului se execută incrementarea counter-ului (totuşi, aceasta nu trebuie să fie neapărat doar incrementarea, ci poate fi şi orice altă operaţie asupra counter-ului), după care din nou se verifică condiţia. O astfel de trecere prin buclă se numeşte iteraţie. Când testarea condiţiei returnează ca rezultat valoarea false, executarea buclei se întrerupe. Mai multe detalii despre sintaxă: for (iniţializare; condiţie; expresie_finală){ //Bloc de cod }
Iniţializarea - cea mai des folosită şi totodată forma de bază a buclei for implică ca în partea de cod prezentată mai sus ca initializare să se definească o variabilă (cel mai des variabila i), care se
va folosi ca şi counter. În majoritatea cazurilor, este foarte util ca valoarea iniţială a acestei variabile să fie 0, deoarece deseori cu ajutorul acestei bucle trecem prin şirul a cărui indexare începe cu zero. În afară de iniţializarea variabilei care va fi counter, aici se pot defini şi alte variabile dacă este necesar. Condiţia - în partea în care este scrisă condiţia, se defineşte expresia al cărei rezultat de executare trebuie să vă returneze o valoare Boolean. Condiţia se construieşte cel mai des prin compararea unei valori cu variabila definită în counter. În caz că această condiţie este îndeplinită, se continuă cu executarea buclei for, în caz contrar executarea buclei se întrerupe. Expresia_finală - codul definit în această parte se execută la sfârşitul fiecărei iteraţii. Cel mai des se foloseşte pentru mărirea (sau modificarea) counter-ului. Notă: Iniţializarea, condiţia şi expresia_finală se separă prin punct şi virgulă (;), separarea fiind obligatorie. În cazuri speciale, este permisă şi omiterea oricărui cod într-una din aceste părţi (chiar şi în toate cele trei părţi), însă semnul punct şi virulă (;) introdus în paranteză trebuie, totuşi, să existe. Exemplu: for ( ; ; ){ //Bloc de cod } Nu scrieţi un astfel de cod, dacă nu sunteţi sută la sută siguri ce vreţi să faceţi.
Următorul exemplu de cod scrie mesajul de întâmpinare de 4 ori: 1"; 3 } 4 5?> Mai întâi, valoarea variabilei $counter este setată la 1. Al doilea parametru conţine condiţia. Blocul de instrucţiuni se va executa atâta timp cât această condiţie este îndeplinită. Al treilea parametru măreşte variabila $counter cu 1. Buclele for se folosesc deseori pentru trecerea prin şiruri. De exemplu: 1
2 // creates a new array of five elements 3 $colors = array('red', 'green', 'blue', 'yellow','white'); 4 for ($i = 0; $i < sizeof($colors); $i++) 5 { 6 $br = $i + 1; echo "Value of element $br is $colors[$i]."; 7 } 8 9 ?> 10
Notă: Deoarece sintaxa pentru crearea şi manipularea şirurilor încă nu este abordată în detaliu în lecţie (dar urmează să fie abordată în lecţiile următoare), aici vom sublinia doar caracteristicile de bază a şirurilor:
Şirurile reprezintă colecţii de date. Aceasta înseamnă că o variabilă poate să conţină mai multe valori diferite; Datele localizate în şir se deosebesc pe baza indexurilor (data localizată pe prima poziţie are indexul 0, data localizată pe a doua poziţie are indexul 1); Indexarea elementelor în şir începe aproape întotdeauna cu 0.
Şirul creat mai sus are cinci elemente; indexurile elementelor sunt cuprinse între 0 şi 4. De aceea, în condiţie se foloseşte o inegalitate strictă pentru a preveni programul să acceseze elementul cu indexul 5, care nu există. Ştim că există trei părţi de iniţializare a buclei for. În exemplele precedente, fiecare parte a avut câte un parametru, dar aceasta nu este o structură obligatorie. Uneori, putem defini mai mulţi parametri într-o singură iniţializare. Următoarea buclă va iniţializa variabilele $i şi $a şi le va acorda diferite valori. Apoi, este setată o condiţie (ca $i să fie mai mic decât 10), după care intervine la ambele valori, mărindu-le cu 1:
1"; 3 ?> 4
Notă: Din exemplul precedent se vede că, la fel ca şi la instrucţiunea if, nu este necesară introducerea parantezelor acolade, în caz că vrem să depindă de buclă doar executarea primei linii de cod care este cuprins de buclă. Vom vedea aceasta în următorul exemplu: "; echo "This line do not depends of loop."; ?>
După executarea codului, pe ecran vom obţine următorul rezultat: 0:5 1:6 2:7 3:8 4:9 5:10 6:11 7:12 8:13 9:14 This line do not depends of loop.
Însă regulile de sintaxă nu subînţeleg introducerea tuturor celor trei parametri. Următorul exemplu va fi, de asemenea, valid: 1for($i=0;$i<10;){ 2 echo $i; $i++; 3 } 4 În exemplu, al treilea parametru este omis, nu este definit. De fapt, acesta nu este omis, ci este gol, lucru pe care îl arată marcajul ; situat după numărul 10. După o astfel de iniţializare, incrementarea este executată în bloc, ceea ce poate fi foarte periculos. Dacă incrementul este exclus, putem să ajungem într-o aşa-numită buclă moartă (buclă care se execută la infinit) care, în cel mai bun caz, va bloca mediul. Atenţie dacă aveţi o buclă moartă, deoarece există diverse moduri ca ea să se producă. Pur şi simplu, fiţi atenţi ca bucla dvs. să nu aibă un aspect în care condiţiile sale de executare să poată fi întotdeauna completate.
De exemplu: 1for($i=1;$i>0;)
echo $i++;
Veţi observa că cele două exemple precedente sunt scrise pe un singur rând. Aceasta se datorează aceleiaşi reguli care este valabilă şi pentru celelalte structuri de control al fluxului. După condiţie, puteţi scrie doar o singură linie de cod fără paranteze. Dacă doriţi să scrieţi un bloc de cod (două sau mai multe linii), trebuie să puneţi tot blocul între paranteze acolade. Am văzut că este posibilă omiterea celui de-al treilea parametru şi rezolvarea funcţiei acestuia cu o nouă linie de cod în propriul corp al buclei. Mai jos, avem un exemplu prin care reprezentăm cum un lucru similar se poate face şi cu ceilalţi doi parametri: 1$i = 0; 2for(;;){ 3 if($i > 9) break; echo $i; 4 $i++; 5 } 6 Luaţi în considerare şi faptul că valoarea buclei va rămâne şi după executarea buclei. Aşadar, dacă scrieţi: 1for($i=0;$i<10;$i++) echo $i; 2 valoarea $i va fi 10 după executare. De aceea, este cel mai bine să respectaţi anumite denumiri standard ale variabilelor, pe care le veţi utiliza numai în acest scop. De exemplu, litera i. Astfel, veţi şti mereu că această literă este rezervată pentru buclă şi nu o veţi utiliza pentru variabilele curente. Fireşte, acest lucru este doar un sfat. Pentru denumirile variabilelor din bucle, sunt valabile aceleaşi reguli ca pentru toate celelalte variabile din PHP. Buclele for pot fi încorporate una într-alta. În practică, veţi vedea că programele mai mari sunt alcătuite din bucle care se află în bucle mai mari, care la rândul lor se află în bucle şi mai mari. Când veţi începe să creaţi singuri structuri mai complexe (cu bucle încorporate), aveţi grijă la ordinea de executare a buclelor. Nu uitaţi că programul dvs., oricât de complex ar fi, este executat secvenţial şi că, dacă în orice moment iniţiaţi un proces, toate celelalte procese vor fi oprite până când procesul iniţiat este terminat (bineînţeles, această regulă nu este valabilă pentru programarea în timp real şi pentru programarea multitasking): 1for($i=0;$i<10;$i++){ for($u=0;$u<10;$u++){ 2 echo $u . "
"; 3 } 4 echo "---$i
"; 5}
6 Se poate observa destul de clar că acest exemplu va scrie variabila $u de 100 de ori. Dar cât va fi acea variabilă $u la fiecare moment al executării? Deoarece bucla $i este bucla externă, iar bucla $u este executată în interiorul ei, de fiecare dată când se desfăşoară o iteraţie a buclei $i, va fi executat un ciclul complet al buclei $u: prima iteratie a buclei $i prima iteratie a buclei $u a doua iteratie a buclei $u ... a zecea iteratie a buclei $u a doua iteratie a buclei $i ....
şi tot aşa, până la ultima iteraţie a buclei $i, când va fi terminat şi ciclul ei întreg. La începutul lecţiei, am menţionat că counter-ul buclei este incrementat. Aceasta nu este o regulă obligatorie. Counter-ul poate fi şi decrementat sau (cum am şi văzut într-un exemplu) nu trebuie neapărat să existe: 1for($i=10;$i>0;$i--) echo $i;
Bucla foreach Această buclă este o variaţie a buclei for, menită exclusiv pentru lucrul cu şiruri, în special cu cele asociative. Tocmai acesta este şi motivul pentru care nu vom intra prea în detaliu în descrierea acestei bucle, ci vom spune doar câteva cuvinte despre bazele funcţionării ei, deoarece încă nu am studiat şirurile. Totuşi, într-unele din lecţiile anterioare am menţionat şirurile şi aici trebuie să vă reamintim că şirurile sunt colecţii de date marcate prin indexuri. Indexarea elementelor în şir începe cu zero. Iată un exemplu de şir care conţine 3 stringuri: 1$colors = array('red', 'yellow', 'green'); Această buclă are două forme. Una subînţelege gestionarea valorilor, iar cealaltă, gestionarea cheilor şi a valorilor. Foreach funcţionează foarte simplu (pentru utilizator), deoarece nu este necesar să ştim nimic despre şirul prin care dorim să trecem, în afară de numele său. La iniţializare, introducem numele şirului şi numele variabilei care dorim să preia valoarea actuală a şirului pe parcursul fiecărei iteraţii. Sau, într-o altă formă, actualele valori ale cheii şi valorile propriu-zise. Prima formă subînţelege:
foreach($array as $value){ bloc de instructiuni }
În cazul primei forme, se trece prin şir şi, la fiecare iteraţie, valoarea elementului curent este plasată în variabila $value/valoare. Apoi, în blocul de instrucţiuni se poate utiliza această variabilă fără a schimba astfel valoarea conţinută în elementul curent al şirului. Priviţi următorul exemplu: 1 $colors = ""; 2$myArray = array('red','green','blue'); 3 4echo "Colors contained in array: "; 5 6foreach($myArray as $value){ $colors .= $value . " "; 7 8echo}$colors; 9 La fiecare trecere prin buclă, valoarea elementului curent este atribuită variabilei $value. Această valoare se scrie apoi în dreptul variabilei $colors, împreună cu un caracter gol. La final, rezultatul va fi: Colors contained in array: red green blue. A doua formă a buclei foreach este: 1foreach (array as $indeks => $value){ bloc de instructiuni 2 } 3 Ea are aceeaşi funcţionalitate ca prima formă, cu diferenţa că valoarea elementului utilizează valoarea indexului şi o plasează în variabila $index. După cum vedeţi, foreach operează destul de automat. Acest lucru are uneori avantaje, dar uneori are şi dezavantaje. Atunci când lucrăm cu foreach, nu gestionăm membrii şirului explicit prin indexuri, ci doar obţinem valorile lor, astfel încât despre foreach se poate spune că este bună atunci când dorim să executăm citirea rapidă şi simplă a unui şir, dar nu şi pentru executarea unor intervenţii mai serioase asupra sa. Deşi în exemplele de mai sus fiecare buclă foreach precede blocul din paranteze acolade, şi în acest caz este valabilă regula că nu trebuie neapărat să existe paranteze acolade pentru o singură linie de cod: 1foreach($arr as $key => $value) echo $value;
Controlul de flux al buclei Controlul de flux al buclei se poate executa în câteva moduri. Primul mod este, bineînţeles, prin modificarea manuală a variabilei de control (counter). 1for($i=0;$i<10;$i++){ 2 if($i>5) $i=10; echo $i . "
"; 3 } 4 În acest exemplu, i-am transmis buclei să fie executată atâta timp cât variabila i este mai mică decât zece cu increment 1. Iar apoi în bloc ne-am răzgândit şi i-am spus că, în cazul în care counter-ul este mai mare decât 5 (deci 6), acesta să obţină valoarea 10. Deoarece counter-ul a obţinut o valoare cu care bucla nu îndeplineşte condiţiile de executare, bucla este părăsită. Această soluţie va funcţiona, dar este destul de inadecvată, deoarece în cazul respectiv trebuie să cunoaştem valoarea-ţintă a counter-ului, fapt care va fi deseori imposibil (de ex. for($i=0;$i<$u;$i++)). Al doilea mod (cel corect) este utilizarea cuvântului-cheie break. Am întâlnit acest cuvânt şi în lecţia precedentă, când am spus că acesta întrerupe necondiţionat executarea blocului de cod: 1for($i=0;$i<10;$i++) 2 { if($i>5) break; 3 echo $i; 4 } 5 Prin utilizarea acestui cuvânt-cheie, bucla noastră nu pierde mult din dimensiune, dar în schimb obţine dinamică, deoarece acum nu mai trebuie să ştim valoarea finală a buclei. Comanda break poate avea şi un parametru. Dacă îl introducem, break va părăsi blocurile la adâncimea marcată în parametru: 1 for($i=0;$i<10;$i++){ 2 for($u=0;$u<10;$u++){ 3 if($u==5) break 2; 4 } 5 echo $i; 6} 7 Dacă pornim acest exemplu, nu va fi afişat nimic pe ecran, deşi instrucţiunea break se află în bucla internă, de care nu avem nevoie pentru executarea buclei externe. Însă, fiindcă în momentul îndeplinirii condiţiei $u=5 în bucla internă, bucla externă încă nu şi-a terminat nicio iteraţie şi nu a ajuns să scrie mesajul pe ecran, iar fiindcă condiţia activează instrucţiunea break
şi are parametrul 2 (deci întrerupe la adâncimea de două blocuri), va întrerupe executarea buclei proprii şi a buclei de deasupra ei. Dar, uneori vom dori să punem o condiţie pe parcursul duratei buclei, prin care (când se îndeplineşte) nu vom dori să facem iteraţia buclei. De exemplu, să ne imaginăm o listă imensă de persoane (câteva milioane). Toţi aceşti oameni se află într-o bază de date şi noi avem nevoie să selectăm un anumit grup în care să fie incluse numai cadrele didactice. De exemplu, citirea datelor despre ocupaţia fiecărui membru al listei durează o secundă, iar citirea datelor complete despre fiecare membru durează 5 secunde. Să presupunem acum că procedura de citire subînţelege: citirea datelor despre profesie, adresa de domiciliu, citirea prenumelui, citirea numelui (ceea ce în totalitate durează 5 secunde). Dacă vom trece prin procedura completă pentru fiecare membru, vom pierde câte 5 secunde per membru, ceea ce pentru toţi membrii înseamnă foarte multe secunde. Pe de altă parte, putem să ne uităm de la început dacă membrul este cadru didactic (pentru care vom avea nevoie de numai o secundă) şi, dacă nu este, să preluăm imediat datele următorului membru din listă şi astfel să economisim 4 secunde. Pentru o listă de câteva milioane de membri, acesta este un număr considerabil de secunde. Acest exemplu simplu arată un mecanism care pentru persoane funcţionează în mod automat, dar pentru ca programul să gândească astfel este necesar să accentuăm procedura în mod explicit. Această accentuare se face prin cuvântul-cheie continue. Pseudo-codul exemplului menţionat, prin utilizarea cuvântului-cheie continue, va arăta astfel: for($membruLista = 0; $membruLista < 1000000; $membruLista ++) { if($membruLista != "cadruDidactic") continue; //COD IMENS CARE CITESTE RESTUL DATELOR DESPRE MEMBRUL LISTEI //...... }
Tipul de date (pe care le cunoaştem), cu care este specializată pentru lucru bucla foreach, este: array integer float resource
Exerciţiul nr. 1 Trebuie să se creeze un program care va desena următoarea structură:
XXXXXXXXXX XXXXXXXXXX
Acest desen trebuie să fie realizat prin intermediul buclei for. De asemenea, prin variabile trebuie determinat câte semne X vor fi pe un rând şi câte semne X va avea structura completă. Ajutor: În momentul emiterii în HTML, un nou rând se poate realiza cu următoarea instrucţiune: echo "
";
Rezolvare: 1 2 0) 7 echo "
"; 8 echo "X"; 9 } 10?> 11 Explicaţia rezolvării: În primul rând, am creat variabile care conţin numărul total de elemente (numElements) şi numărul de elemente de pe un rând (rowEl). După aceea, creăm bucla externă for, care va executa câte o iteraţie pentru fiecare element. În cadrul acestei bucle, punem ramificarea condiţionată if şi cercetăm dacă variabila $i, care reprezintă counter-ul, se poate împărţi cu numărul de elemente de pe un rând. În afară de aceasta, cercetăm şi dacă $i este mai mare decât 0. Dacă toate aceste condiţii sunt îndeplinite, trebuie să trecem pe un rând nou, aşadar scriem tagul html "
". După această cercetare, începem scrierea elementului, respectiv a caracterului "X".
Exerciţiul nr. 2 În aplicaţie, intră un anumit număr care se află în variabila $selectedNumber. Trebuie să se facă o buclă care se execută de atâtea ori cât este valoarea variabilei $selectedNumber şi cu ocazia
fiecărei iteraţii creşte la exponentul egal cu numărul iteraţiei curente a buclei (primul circuit al buclei ^1, al doilea circuit ^2...). Ajutor: PHP cunoaşte funcţia pentru exponent: pow(valoare, exponent) Rezolvare: 1$selectedNumber = 20; 2for($i=1;$i<=$selectedNumber;$i++) echo pow($selectedNumber,$i) . "
"; 3 Folosind bucla for, asigurăm executarea codului prin câteva iteraţii. Deoarece variabila $i are rol de counter, iteraţiile se vor executa până când valoarea pentru $i este mai mică sau egală cu numărul definit cu variabila $selectedNumber, începând de la 1. Cum după linia: 1for($i=1;$i<=$selectedNumber;$i++) nu este definit blocul de cod, la fel executarea următoarei linii va depinde de buclă. Prin setare, se solicită ca numărul selectat în fiecare iteraţie să fie ridicat la exponentul care corepunde numărului de iteraţie. Ca să ridicăm un număr la exponentul dorit, folosim funcţia pow(). Aceasta lucrează cu doi parametri obligatorii. Primul parametru este baza, iar al doilea exponentul. Exerciţiul nr. 3 Pe baza următoarelor variabile: $a = 5; $b = 8;
şi a buclelor încorporate, trebuie să se obţină următoarea ieşire: 012345678 100000008 200000008 300000008 412345678
Rezolvare: 1
{ 5 echo $i; 6 for($u = 1; $u <= $b; $u ++) 7 { 8 if($u == $b || $i == 0 || $i == $a-1) echo $u; 9 else 10 echo "0"; 11 } 12 echo "
"; 13 } 14?> 15 16
Dacă ne uităm cu atenţie la structura tabelului de numere care este dat în cerinţă, observăm că acesta este alcătuit din 5 rânduri şi 9 coloane. Asta înseamnă că probabil vom avea nevoie de două bucle. Numărarea iteraţiilor în bucle o putem începe de la orice număr vrem, aşadar bucla for care va control prezentarea rândurilor o vom începe de la 0, iar bucla care se referă la numărul de coloane o vom începe de la 1. Astfel, vom crea imediat două variabile, care vor prezenta numărul de rânduri şi coloane în acord cu această logică pentru counter-ele buclei: 1$a = 5; 2$b = 8; Numărul de rânduri se defineşte cu bucla care foloseşte variabila $i ca şi counter, iar condiţionarea o face comparativ cu variabila $a. Deci, acum avem următorul cod: 1$a = 5; 2 $b = 8; 3 for($i = 0; $i < $a; $i++){} Rămâne să rezolvăm structura corpului buclei. Cum pe primul loc de pe fiecare rând o să scriem numărul care corespunde iteraţiei (aminitim că iteraţiile se numără cu variabila $i), imediat setăm codul pentru această scriere: 1echo $i; Acum, definim a doua buclă la care numerotarea începe de la 1 şi ţine până când counter-ul ($u) este mai mic sau egal cu valoarea variabilei $b. După finalizarea acestei bucle, înseamnă că am terminat cu acest rând şi acum trebuie să trecem la următorul, aşadar setăm BR tag. Codul nostru arată astfel: 1$a = 5; = 8; 2$b for($i = 0; $i < $a; $i++) 3{ 4 echo $i;
5 for($u = 1; $u <= $b; $u ++){} echo "
"; 6 } 7 8 Fiecare iteraţie a buclei interne va avea drept scop scrierea unui caracter pe rând. Ca să respectăm formularul modelului dat în problemă, trebuie să facem condiţionarea cu care se stabileşte dacă pe pagină va fi prezentat numărul care corespunde counter-ului $u sau cifra 0. Dacă valoarea counter-ului buclei interne corespunde cu valoarea variabilei $b, trebuie prezentată valoarea acestui counter şi de aceea prima noastră verificare este: 1$u == $b De asemenea, pe primul rând trebuie prezentate pe rând numerele de la 0 la 8, fapt care va avea loc când se îndeplineşte următoarea condiţie: 1$i == 0 La final, trebuie verificat şi dacă $i == $a-1, pentru a stabili dacă este vorba de ultimul rând (amintim că $a trebuie redus cu 1, deoarece începem numărarea de la 1, iar counter-ul $i începe de la 0). Cu aceasta exemplul nostru este finalizat. Exerciţiul nr. 4 În aplicaţie, intră două variabile: $numberOfCharacters = 50; $characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Trebuie creată o aplicaţie care generează parola pe baza setului de caractere atribuit şi a numărului. Parola trebuie să conţină majuscule şi minuscule din lista de caractere $characters. De asemenea, parola trebuie să aibă atâtea caractere câte sunt indicate în variabila $numberOfCharacters. Parola trebuie emisă la ieşire. Rezolvare: 1
7echo $pass; 8?> 9 Explicaţia rezolvării: Creăm variabila cu care determinăm lungimea parolei pe care o vom genera ($numberOfCharacters). Apoi, creăm baza de caractere prin definirea variabilei $characters. Deoarece valoarea acestei variabile este alcătuită doar din majuscule, trebuie să adăugăm şi toate minusculele. Ca să nu scriem toate aceste caractere, folosim funcţia strtolower(), care converteşte toate literele din string în minuscule, iar rezultatul funcţionării funcţiei îl alăturăm celorlalte caractere, după care în sfârşit obţinem variabila $allCharacters. Următoarea parolă va fi inserată în valoarea $pass, de aceea creăm această variabilă la început, ca un string gol. Trecând prin bucla for, în fiecare iteraţie accesăm un caracter aleatoriu al stringului $allCharacters, lucru pe care îl obţinem prin funcţia rand(). După ce bucla trece şi ultima iteraţie, începem afişarea variabilei $pass.
Bucla while Unitate: 8 din 19 00:22:43 +Rezumat În PHP, bucla while reprezintă cea mai simplă buclă. La fel ca şi instrucţiunea if, pe care am abordat-o în lecţiile precedente, şi bucla while depinde de condiţii. Trebuie să facem o paralelă între while şi if. Pentru a şti care instrucţiune este mai corectă pentru a fi utilizată, începeţi de la instrucţiunea care trebuie să se execute după îndeplinirea condiţiilor. Principala deosebire este tocmai faptul că instrucţiunea if execută doar o singură dată blocul de instrucţiuni care urmează după îndeplinirea condiţiilor, în timp ce bucla while execută instrucţiunile atâta timp cât condiţia este îndeplinită. Mai jos, puteți vedea o reprezentare grafică a funcţionării acestei bucle:
8.1 - Schema while Bucla while intră în categoria în care trebuie cunoscut în prealabil numărul de iteraţii. Pur şi simplu, această buclă se execută de atâtea ori câte îi permite condiţia care se execută în ea. Bucla while necesită o anumită condiţie, care se introduce ca şi parametru în timpul iniţializări buclei şi se execută până ce condiţia este îndeplinită. Pentru asigurarea executării codului în interiorul buclei while, condiţia definită la începutul instrucţiunii while trebuie să fie îndeplinită. Condiţia pe care o definim în timpul creării buclei while nu se deosebeşte deloc de condiţia pe care am utilizat-o în timpul definirii instrucţiunilor if. Condiţia are un rol foarte important, deoarece uneori trebuie să întrerupem executarea buclei ca să nu ne găsim în deja menţionata buclă moartă. Să vedem acum sintaxa: while (conditie) { //Blocul de cod care se va executa daca conditia nu este indeplinita } Să analizăm următorul exemplu: 1 = 2) 5{ echo $number . "
"; 6 $number -= 1; 7 } 8?> 9
Variabila $number primeşte la începutul codului valoarea 5. Apoi, este verificată condiţia ($number >= 2). Fiindcă această condiţie este îndeplinită, programul începe să execute blocul de instrucţiuni din interiorul buclei while. În interiorul acestui bloc, se scrie numărul curent, care apoi se micşorează cu 1. După prima trecere prin blocul de instrucţiuni, se verifică încă o dată condiţia. Se va repeta executarea instrucţiunilor din interiorul buclei atâta timp cât condiţia este corectă. După ieşirea din buclă, rezultatul va fi următorul: 5 4 3 2 Vedem că în iniţializarea buclei nu există incrementare ca în bucla for. De fapt, această buclă nici nu trebuie să gestioneze vreun counter. Singurul lucru de care aceasta are nevoie este ca, la fiecare iteraţie care urmează, valoarea condiţiei să fie corectă/true. Acest lucru poate fi o problemă, pentru că va trebui să controlăm manual acest tip de buclă. De exemplu, ce s-ar întâmpla dacă am omite din exemplul precedent această parte: $number -= 1; Bucla s-ar transforma în buclă moartă şi probabil ar bloca întreaga aplicaţie. Bucla while se utilizează des în aplicaţii care operează în timp real. De exemplu, probabil nu există niciun joc care să nu conţină în mecanismul său principal o astfel de buclă. Dar, spre deosebire de jocuri şi alte programe în timp real, PHP nu are contact direct cu utilizatorul şi nu este capabil să recunoască intrarea utilizatorului (apăsarea unei taste sau a mouse-ului), aşadar în PHP utilizarea buclei while se reduce la o iteraţie simplă prin datele provenite de la o sursă, parsarea acestor date şi altele. De exemplu, citirea fişierelor, atunci când este necesar să citim un fişier linie cu linie, până când liniile se termină. De aceea, este foarte important să avem permanent în buclă un mijloc de gestionare a buclei (pe lângă instrucţiunile break şi continue). Şi, de aceea, această buclă acceptă exclusiv tipul Boolean ca rezultat al expresiei condiţionate, deşi nici dacă este utilizată o altă scriere nu va fi semnalată o eroare de sintaxă. De exemplu, următorul exemplu se va executa, dar este complet inutilizabil şi duce la o buclă moartă: while( 1 + 3 ) echo "se executa";
Bucla while se foloseşte, de obicei, când nu se ştie de dinainte cât va fi iteraţia (de câte ori trebuie să se execute comanda stabilită). Când numărul ciclurilor este cunoscut, folosim bucla for. De asemenea, bucla while se poate încorpora (embed). Desigur, trebuie să aveţi un control complet asupra codului pentru a nu omite ceva şi, bineînţeles, pentru a nu interveni erori după executarea programului. Se recomandă să folosiţi paranteze acolade când faceţi încorporarea
codului. Instrucţiunile while (în acest caz) sunt scrise una într-alta cu condiţii de îndeplinire şi instrucţiuni de executare. Să vedem următorul exemplu: 1 2 $i = 0; 3 while ($i++ < 3){ echo "first
"; 4 while (1){ 5 echo "second
"; 6 while (1){ echo "third
"; 7 continue 3; 8 } 9 echo "This line will never be executed.
"; 10 } 11echo "This line either.
"; 12} 13 După executarea programului, la ieşire vom obţine următorul rezultat: first second third first second third first second third
Bucla while se poate împărţi în două tipuri: while şi do while. Este vorba de bucla care nu se execută nici măcar o dată, în cazul în care condiţia nu este îndeplinită (while), şi de bucla care se execută cel puţin o singură dată, chiar dacă condiţia nu este îndeplinită (do while). Am văzut deja primul tip. Nimic din interiorul buclei din exemplul dat nu se va executa dacă variabila $number nu este mai mare sau egală cu numărul doi. Dar ce se întâmplă dacă vrem ca totuşi corpul să se execute cel puţin o singură dată?
Bucla do...while Această buclă este similară cu cea precedentă, cu deosebirea că la bucla do...while condiţia se verifică după executarea blocului de instrucţiuni, şi nu înainte. Aceasta înseamnă că blocul de instrucţiuni din interiorul buclei do...while se va executa cel puţin o dată, indiferent dacă condiţia este îndeplinită sau nu. Do while ne asigură ca în primul rând să se execute blocul de instrucţiuni în cadrul instrucţiunii do, iar apoi să se treacă prin condiţie. Următoarele executări ale instrucţiunilor, respectiv dacă
partea din blocul do se va executa din nou, depinde de condiţie. Să analizăm următoarea reprezentare grafică:
8.2 - Schema do...while Analizând schema, ajungem la concluzia că blocul de cod al buclei va fi oricum executat o dată. Abia după executarea codului, urmează testarea condiţiei. Dacă condiţia nu este îndeplinită, bucla se părăseşte, în timp ce, dacă condiţia este îndeplinită, blocul se va executa din nou, după care urmează iarăşi testarea condiţiei. Un astfel de circuit continuă până ce condiţia este îndeplinită sau până ce cu instrucţiunea break se părăseşte bucla do...while. do{ //Bloc de cod }while(conditia care se testeaza);
Codul care urmează mai jos este similar cu unul dintre conturile anterioare, însă de această dată blocul de cod se execută o singură dată, indiferent de condiţie. Abia pentru fiecare iteraţie care urmează se execută verificarea condiţiei: 1$number = 5; 2do{ 3 echo $number . "
"; $number -= 1; 4 } 5 while($number >= 2); 6 În bucla while, sunt valabile aceleaşi reguli de sintaxă ca şi în celelalte structuri de flux: break, continue şi regula de punere obligatorie între paranteze acolade, dacă blocul este mai lung decât o singură linie.
Toate acestea sunt valabile şi pentru do while. Dar fiţi atenţi la scrierea fără paranteze acolade pentru că, deşi pare că blocul este mărginit de structură (ca în cazurile switch-case), în bucla do while nu numai că nu se va executa mai mult de o singură linie în interiorul buclei (fără paranteze acolade), ci se va produce şi o eroare. Acest cod se va executa fără probleme: 1$a = 5; 2do 3echo $a ++; 4while( $a < 5 ); Dar acest cod va semnala o eroare: 1$a = 5; 2do 3echo $a ++; 4echo "This line occurs error"; 5while( $a < 5); Observaţi şi faptul că în faţa instrucţiunii do nu există semnul ; , dar acest semn este obligatoriu după linia care conţine instrucţiunea while (ultima linie).
Exerciţiul nr. 1 Se dă următorul cod: $html = << #I#
HTML; $divNum = 10; $style = "border: 1px solid black; background: yellow; margin: 5px; padding: 4px;";
Cu ajutorul buclei, trebuie scris codul care va afişa codul html în variabila $html cel puţin o dată, în timp ce numărul maxim de ori trebuie menţionat în variabila $divNum. Cu ocazia fiecărei iteraţii, în tagul div în loc de semnul #I# va fi numărul iteraţiei, în timp ce în loc de semnul #S# trebuie să fie stilizarea specificată în variabila $style. Rezolvare: 1 2 3 4 5