0% au considerat acest document util (0 voturi)
102 vizualizări270 pagini

Web05DezvoltareaAplicatiilorWeb PHP

Încărcat de

Mihaela Nicoleta
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
102 vizualizări270 pagini

Web05DezvoltareaAplicatiilorWeb PHP

Încărcat de

Mihaela Nicoleta
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 270

Tehnologii Web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


programare Web (III)
dezvoltarea aplicațiilor Web
cu limbajul și mediul PHP

Dr. Sabin Corneliu Buraga – profs.info.uaic.ro/~busaco/


Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
„E mediocru ucenicul
care nu-și depășește maestrul.”

Leonardo da Vinci
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
Cum folosim un server de aplicații
pentru a dezvolta o aplicație Web?
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Scop:
eficientizarea proceselor de dezvoltare
a aplicațiilor Web de anvergură
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Integrat în unul/mai multe servere Web

de asemenea, poate oferi propriul server Web


sau mediu de execuție
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Poate încuraja sau impune o viziune arhitecturală
privind dezvoltarea de aplicații Web

situație tipică:
MVC ori variații

(re)vezi prezentarea
anterioară
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Simplifică maniera de invocare
de programe (script-uri) ale unei aplicații Web

generarea de conținut dinamic pe partea de server


server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Aspecte de interes:

limbaj(e) de programare
API-ul de bază
stocare persistentă a modelelor de date
interacțiune Web
cookie-uri și sesiuni
medii de dezvoltare + cadre de lucru, componente,…
caracteristici particulare
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Limbaj(e) de programare
oferind suport pentru una sau mai multe paradigme:
imperativă
obiectuală
funcțională
reactivă
concurentă
paralelă

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Limbaj(e) de programare
statice – exemple: C#, Java, Rust
versus
dinamice – e.g., JavaScript, PHP, Python, Ruby
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Limbaj(e) de programare
procesate prin interpretare (Perl, Python, Ruby)
și/sau compilare (C, C++, Rust)

uzual, se preferă generarea de cod intermediar:


IL (Intermediate Language) – C#, Erlang, Java, Scala,…
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Limbaj(e) de programare
procesate prin interpretare (Perl, Python, Ruby)
și/sau compilare (C, C++, Rust)

uzual, se preferă generarea de cod intermediar:


IL (Intermediate Language) – C#, Erlang, Java, Scala,…

mai recent, în momentul rulării: Just-in-Time (JIT)


în contextul Web: JavaScript, PHP 8, TypeScript
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


API de bază

contribuie la „puterea” limbajului și


a serverului de aplicații
(via funcții/clase predefinite)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


API de bază

contribuie la „puterea” limbajului și


a serverului de aplicații
(via funcții/clase predefinite)

securitate, consistență,
acces la resursele mediului de operare/rulare,
asigurarea independenței de platformă etc.
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

în baze de date relaționale – folosind SQL


server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

în baze de date relaționale – folosind SQL

exemple:
ADO.NET pentru ASP.NET
Java – JDBC (Java DataBase Connectivity)
PHP – funcții/module predefinite, plus biblioteci
incorporate (SQLite + mysqli) sau diverse extensii
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

în baze de date relaționale – folosind SQL

ORM (Object-Relational Mapping): șablonul Data Mapper


Go – framework-ul Xorm
Java – specificația JPA (Java Persistence API)
+ implementări: EclipseLink, Hibernate, OpenJPA,…
Node.js – biblioteca Sequelize
PHP – framework-uri: Cycle ORM, Doctrine, Propel, RedBean etc.
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

în baze de date relaționale – folosind SQL

Active Record – șablon arhitectural utilizat în cadrul ORM


pentru a încapsula într-o clasă o tabelă sau un view
exemple:
active_record, TypeORM (module Node.js), Castle Project (.NET),
DBIx::Class (Perl), Django ORM și Orator (Python),
Play Framework (Java, Scala), Rails (Ruby)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

pe baza modelelor arborescente: XML

date (semi)structurate
transformări în alte formate: XPath, XSLT
procesări: DOM, SAX, SimpleXML etc.
validări de date: DTD, XML Schema, RELAX,…
interogări: XQuery cursurile
viitoare
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stocare persistentă

recurgând la alte paradigme non-relaționale


(bazate pe grafuri și/sau cheie—valoare)
distribuite la nivel de Internet, scalabile – NoSQL
github.com/erictleung/awesome-nosql
nosql.mypopescu.com/kb/nosql

exemplificări:
Cassandra, MarkLogic, MongoDB, Neo4j, OpenLink Virtuoso, Redis
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

facilitată de controale specificate


în cadrul codului-sursă invocat la nivel de server
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

facilitată de controale specificate


în cadrul codului-sursă invocat la nivel de server

se pot emula câmpuri din formularele HTML și/sau


oferi noi controale interactive – e.g., calendar, slideshow,…

generare de cod procesabil la nivel de client (front-end)


componente Web (HTML + CSS + JavaScript) executate de browser
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

exemplificări:
ASP.NET (<asp:control> – e.g., FileUpload, ListBox, Table,...)
framework-ul PRADO (PHP)
formidable, form-data, forms – module Node.js
platforma Java: specificația JSF (Jakarta Server Faces)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

încurajarea folosirii de machete de vizualizare (templates)


pe baza unui procesor specific

Web template system


server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

Web template system

utilizând specificații de prezentare a conținutului


(Web template), datele persistente
(e.g., preluate dintr-o bază de date sau fișiere) sunt folosite
de un procesor (template engine)
pentru a genera documente HTML
ori alte reprezentări în alte formate
<!-- macheta HTML -->
<h1 class="profile">User profile: [@username]</h1>
<img src="[@photoURL]" alt="photo"/>
implementare
<div class="identity">[@firstName] [@lastName]</div>
User profile: Tux

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


<div class="location">[@location]</div>
Tuxy Pinguinesscool
// program PHP: procesarea machetei
$profile = new Template ('templates/profile.tpl');
🐧 Romania
$profile->set ('username') = 'Tux';
$profile->set ('photoURL') = 'imgs/tux.svg';
$profile->set ('firstName') = 'Tuxy';
$profile->set ('lastName') = 'Pinguinesscool';
$profile->set ('location') = 'Romania';
exemplu:
specificația de prezentare a conținutului
(HTML template – .tpl) include nume de variabile – aici,
de forma [@variabilă] – ce vor fi înlocuite cu valorile efective
preluate din program în urma rulării componentei
de procesare a machetelor de vizualizare
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

Web template system

la nivel de server

Apache FreeMarker (Java), Blade (PHP), Haml (Ruby),


Mustache (C++, JS, PHP, Python, Scala,…), Pug (Node.js),
Razor (.NET), Smarty (PHP), Tonic (PHP), XSLT (XML)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

Web template system

la nivel de client

disponibile pentru JavaScript:


doT, EJS, Handlebars, Mustache.js, Nunjucks,…
github.com/sorrycc/awesome-javascript#templating-engines
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

managementul cookie-urilor și sesiunilor

via structuri/tipuri de date – diverse exemplificări:


clasa HttpSession (ASP.NET), interfața HttpSession (servlet-uri Java),
HTTP::Session (Perl), session (Flask – framework Python), web.session
(web.py), HttpFoundation (componentă Symfony – framework PHP),
clasa SessionComponent (CakePHP), tabloul session (Ruby on Rails),
play.mvc.Http.Cookie (Play pentru Java/Scala), sessions (Gorilla – Go)
cookie-parser și express-session (module Node.js pentru Express)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiune Web

transfer asincron de date via suita de tehnologii Ajax

vezi cursurile
viitoare

eventual, via framework-uri/module/clase adiționale


avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport acordat ingineriei software
stimularea/impunerea folosirii unor șabloane de
proiectare (arhitecturale, comportamentale, structurale,
vizând procesările concurente și/sau distribuite și altele)
AMI (asynchronous method invocation), broker,
CBD (components-based development), DAO (data access object),
DDD (domain-driven design), DTO (data transfer object), façade,
MOM (message-oriented middleware), microservice, MV*,
publish-subscribe, SOA (service-oriented architecture), singleton,…
proiectare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


exemplificare: anti-șablonul Spaghetti Code
uzual, specific aplicațiilor – aici, Web – care „amestecă”
partea de procesare cu maniera de prezentare (view)
și mecanismul de acces la modelul datelor
sourcemaking.com/antipatterns/spaghetti-code
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport acordat ingineriei software

încurajează adoptarea unei/unor arhitecturi:


stratificate (layered)
conduse de evenimente (event-driven)
extensibile (microkernel / plug-in)
folosind microservicii (microservices)
„în nori” (space-based, cloud)

conform M. Richards, Software Architecture Patterns, O’Reilly, 2015


www.oreilly.com/programming/free/files/software-architecture-patterns.pdf
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Exemple – inclusiv framework-uri

C++ – CppCMS, Silicon, TreeFrog, Wt


C# et al. (platforma .NET) – ASP.NET
D – Dweb, vibe.d
Dart – Aqueduct, shelf, Stream,…
Erlang / Elixir – Chicago Boss, Phoenix, N2O, Sugar
Go – Beego, Buffalo, Gin, Gorilla, Revel
Haskell – Snap, Spock, Yesod etc.
inspectarea tehnologiilor
folosite de o aplicație Web
cu instrumentele

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Wapplyzer și WhatRuns
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Exemple – inclusiv framework-uri

Java (Jakarta Enterprise Edition – ex-J2EE) – GlassFish,


JBoss, Tomcat, Payara + Apache Struts, Apache Wicket,
Grails, Spring, Vaadin
JavaScript (ECMAScript) – Node.js + Derby, Express,
Locomotive, Meteor,…
Perl – Catalyst, CGI::Application, Mojolicious
PHP – PHP
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
inspectarea tehnologiilor
folosite de o aplicație Web
cu instrumentul WhatRuns
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Exemple – inclusiv framework-uri

Python – Gunicorn, Tornado, uWSGI, Waitress etc.


(pe baza specificației WSGI – Python Web Server Gateway Interface)
+ Django, TurboGears, web2py
Ruby – Passenger, Puma, Thin, Unicorn,…
(implementează specificația Rack)
+ Ruby on Rails, Sinatra
Rust – Gotham, Iron, Rocket, Rouille etc.
Scheme – Artanis
TypeScript – Deno, LoopBack
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
inspectarea tehnologiilor folosite
de o aplicație Web
cu instrumentul WhatRuns
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Exemple – inclusiv framework-uri

abordare multi-limbaj:
Vert.x
(disponibil pentru Java, JS, Groovy, Ruby, Ceylon, Scala,…)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Integrat într-o stivă de tehnologii (software stack)

suită software (servere, instrumente, utilitare,…)


oferind suport pentru dezvoltarea de aplicații Web

disponibilă – uzual, în regim open source –


pentru o anumită platformă
(sistem de operare, server Web, server de baze de date,
server de aplicații, limbaj de programare)
server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Integrat într-o stivă de tehnologii (software stack)

LAMP
(Linux, Apache HTTP Server, MariaDB/MongoDB, Perl/PHP/Python)

alternative:
FAMP (FreeBSD), MAMP (macOS),
WAMP (Windows), XAMP (multi-platformă)

www.apachefriends.org
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


www.wamp.net
instrumente dedicate
dezvoltatorilor Web
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Integrat într-o stivă de tehnologii (software stack)

pe baza JavaScript – full stack Web development

MEAN (MongoDB, Express, Angular, Node.js)


MERN (MongoDB, Express, React, Node.js)

de parcurs
suplimentul Node.js
avansat

server de aplicații web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Integrat într-o stivă de tehnologii (software stack)

abordări complementare:
LAPP (Linux, Apache, PostgreSQL, Perl/PHP/Python)
LEMP (Linux, Nginx, MySQL/MariaDB, Perl/PHP/Python)
LLMP (Linux, Lighttpd, MySQL/MariaDB, Perl/PHP/Python)
LYCE (Linux, Yaws, CouchDB, Erlang)
LYME (Linux, Yaws, Mnesia, Erlang)
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


inspectarea tehnologiilor folosite de o aplicație Web
cu instrumentul WhatRuns
Informații esențiale despre PHP?

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


php

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Istoric

Caracteristici importante

Limbajul de programare PHP


paradigme: procedurală, obiectuală, funcțională

PHP ca platformă de dezvoltare Web


interacțiune, acces la baze de date, framework-uri,
biblioteci și instrumente, studii de caz concrete
Personal Home Page Tools (1995)
Rasmus Lerdorf
PHP 3 (1998)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


dezvoltat de Zend – Zeev Suraski & Andi Gutmans
PHP 4 (2000)
suport pentru programare obiectuală
PHP 5 (2004) – varianta cea mai recentă: PHP 5.6 (2014)
noi facilități inspirate de Java
PHP 7 (2015), PHP 7.2 (2017), PHP 7.4 (2019)
strong typing, suport pentru Unicode, performanță,…
PHP 8 (noiembrie 2020)
actualizare majoră: compilare în timp-real, noi tipuri
de date și construcții sintactice, îmbunătățiri etc.
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Server de aplicații Web

oferă un limbaj de programare


de tip script, interpretat

poate fi inclus direct și în cadrul documentelor HTML


php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Limbajul PHP este procedural, oferind suport și
pentru alte paradigme de programare
(obiectuală și, mai recent, funcțională)

poate fi folosit și ca limbaj de uz general


php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Sintaxă inspirată de C, Perl și Java – case sensitive

spațiile albe (caracterele spațiu, Tab, New Line) n-au


niciun efect asupra modului de execuție a programului

uzual, fișierele ce conțin cod-sursă PHP au extensia .php


php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Disponibil gratuit – open source – pentru
diverse platforme (FreeBSD, Linux, Windows, macOS etc.)
și servere Web: Apache, IIS, Nginx,…

www.php.net
www.zend.com
Maniera de funcționare a procesorului (engine-ului) PHP
Server Web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


cerere HTTP server de
(GET, POST,...) procesor
aplicații (engine)
Client
PHP Zend
Web
răspuns
(reprezentare)
HTML, PNG, PDF,


SVG, JSON, ZIP,...
programe
.php


resurse (externe)
Maniera de funcționare a procesorului (engine-ului) PHP
Server Web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


cerere HTTP server de
(GET, POST,...) procesor
aplicații (engine)
Client
PHP Zend
Web
răspuns
(reprezentare)
HTML, PNG, PDF,


SVG, JSON, ZIP,...
programe
.php

eventual, pot fi integrate



resurse (externe)
diverse extensii (module)
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Programul PHP e interpretat de Zend Engine 2
care generează instrucțiuni interne – opcodes

www.php.net/manual/en/internals2.opcodes.php
www.phpinternalsbook.com
program (script) PHP cod-sursă Java
execuție compilare

interpretor PHP

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


procesare (parse) procesare (parse)

compilator Java
compilareopcodes compilarebytecodes

execuție (Zend) salvare cod binar

rezultat (output) fișier binar (.class)


execuție
fazele importante ale interpretării
Java Virtual Machine
programelor PHP
vs. compilarea codului Java
rezultat (output)

codul PHP e interpretat de fiecare dată


când trebuie executat
<?php avansat
class Greeting { convertirea codului PHP
public function sayHello ($to)
în opcodes

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


{
tinyurl.com/zn6c53x
echo "Hello $to";
}
}

$greeter = new Greeting ();


$greeter->sayHello ("World");
?>

line # * op fetch ext return operands


----------------------------------------------------------------------------
3 0 > EXT_NOP
1 RECV !0
5 2 EXT_STMT
3 ADD_STRING ~0 'Hello+'
4 ADD_VAR ~0 ~0, !0
5 ECHO opcodes ~0
6 6 EXT_STMT
7 > RETURN null
program PHP avansat
execuție
php: caracterizare
check opcode cache

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


nu există în cache există în cache (cached)

procesare (parse) preluare din


memoria partajată
compilareopcodes (shared memory)

salvare în
memoria partajată
pentru eficiență,
opcode-urile
execuție (Zend Engine) sunt stocate
într-o memorie
rezultat (output) partajată
precision = 14 ; controlul preciziei valorilor float – detalii la php.net/precision
safe_mode = Off ; controlul procesării – de studiat php.net/safe-mode
disable_functions = "allow_url_fopen, eval" ; funcții nepermise (e.g., rațiuni de securitate)
max_execution_time = 30
php: caracterizare
; număr maxim de secunde privind execuția unui program

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


memory_limit = 128M ; dimensiunea maximă a memoriei alocate unui script
post_max_size = 8M ; dimensiunea maximă a datelor transmise prin metoda POST
default_mimetype = "text/html" ; tipul MIME implicit transmis de un script PHP
file_uploads = On ; sunt acceptate preluări (upload-uri) de fișiere
upload_max_filesize = 32M ; dimensiunea maximă a unui fișier preluat de la client
session.use_cookies = 1 ; sesiunile Web vor recurge la cookie-uri
session.name = PHPSESSID ; numele cookie-ului referitor la sesiunea Web

; precizarea extensiilor încărcate la inițializarea serverului de aplicații
extension=php_pdo_sqlite.dll ; suport pentru SQLite via PDO (PHP Data Objects)
extension=php_mysqli.dll ; suport pentru MySQL
extension=php_soap.dll ; suport pentru servicii Web dezvoltate cu SOAP

diverse comportamente ale platformei PHP,


inclusiv încărcarea extensiilor (biblioteci partajate .so/.dll),
se pot configura via fișierul php.ini
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Maniera de rulare a programelor PHP
– eventual, la nivel de bloc de cod –
poate fi ajustată via directiva declare
www.php.net/manual/en/control-structures.declare.php

// setul de caractere folosit pentru generarea conținutului


declare (encoding='UTF-8');

// verificare strictă a tipurilor de date la PHP 7+


declare (strict_types=1);
avansat

php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pentru creșterea performanței,
se poate adopta compilarea JIT – just-in-time

HHVM – HipHop Virtual Machine (Facebook)

cod sursă PHPopcodescod mașină (e.g., x86-64)


JIT
www.hhvm.com  github.com/facebook/hhvm/
avansat

php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pentru creșterea performanței,
se poate adopta compilarea JIT – just-in-time

HHVM – HipHop Virtual Machine (Facebook)

include și un server Web performant: Proxygen


permite încărcarea de extensii scrise în PHP/C++
utilizată de Baidu, Box, Etsy, Facebook, Wikipedia,…
avansat

php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pentru creșterea performanței,
se poate adopta compilarea JIT – just-in-time

PHP 8 oferă suport nativ

www.zend.com/blog/exploring-php-8
www.zend.com/blog/exploring-new-php-jit-compiler
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Interacțiunea cu utilizatorul:

preluarea valorilor câmpurilor formularelor Web


cookie-uri
sesiuni
autentificarea utilizatorului

acces la variabile globale – create „din zbor”


php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Facilități pentru tehnologiile Web:

prelucrare de URL-uri
suport pentru HTTP – inclusiv cURL
caching via memcached
dezvoltare de servicii Web prin SOAP și REST

…și altele
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport pentru acces la baze de date:

la nivel abstract

DBAL (DataBase Abstraction layer)


iODBC (Independent Open DataBase Connectivity)
PDO (PHP Data Objects)

www.phptherightway.com/#databases_abstraction_layers
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport pentru acces la baze de date:

specific unui server de baze de date

relațional: DB2, MySQL, Oracle, PostgreSQL, SQLite,…


bazat pe NoSQL – e.g., MongoDB

a se parcurge www.phptherightway.com/#databases
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Prelucrarea conținutului resurselor:

fișiere audio – via biblioteci: ktaglib, oggvorbis etc.


arhive de tip bzip2, LZF, RAR, ZIP, ZLIB
documente PDF
conținut grafic în diverse formate
fișiere în format JSON
documente XML – creare, procesare, validare etc.
informații privind cărți de credit
...
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport pentru resurse de sistem + Internet:

sisteme de fișiere, inclusiv FTP


procese – cu Libevent, PCNTL, pthreads,...
răspuns la evenimente – via Event
socket-uri
poștă electronică – e.g., IMAP, POP3

...și multe altele


(în loc de) pauză

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


wronghands1.files.wordpress.com/2020/01/reference-shelf.jpg
PHP ca limbaj de programare procedurală

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Programare procedurală
(procedural programming)
paradigmă bazată pe apeluri de proceduri (rutine, funcții)
conținând o serie de pași pentru realizarea calculelor
limbajele procedurale sunt imperative, utilizând
instrucțiuni (comenzi) ce modifică starea programului

exemple: FORTRAN (1954), ALGOL (1958),


BASIC (1964), Pascal (1970), C (1972), Ada (1978)
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


boolean

true sau false


php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


int

valori întregi specificate în baza…

10 (decimal) 3734
16 (hex) 0xE96
8 (octal) 07226
2 (binary) 0b111010010110

www.php.net/manual/en/language.types.integer.php
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


float

numere reale
reprezentate uzual conform IEEE 754 (dublă precizie)

dimensiunea reprezentării e dependentă de platformă


(precizia poate fi ajustată în fișierul de configurare php.ini)

www.php.net/manual/en/language.types.float.php
floating-point-gui.de
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


float

valoare specială:
constanta NAN (not a number)

funcții predefinite utile:


is_nan()
is_finite()
is_infinite()
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


string

șiruri de caractere ASCII


(începând cu PHP 7, există suport nativ pentru Unicode)
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


string

șiruri de caractere ASCII


(începând cu PHP 7, există suport nativ pentru Unicode)

pot fi folosite caractere escape precum


\n (New Line) \r (Carriage Return) \t (Tab)
\\ (Backslash) \$ (Dollar) \" (Double Quote) \' (Quote)
php: tipuri de date – scalare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


string

delimitatori uzuali:
" sau '

un șir nu poate avea mai mult de 2 GB


php: tipuri de date – compuse

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


array

asociere între valori (de orice tip)


și chei (de tip int sau string)
php: tipuri de date – compuse

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


array

nu există o distincție clară


între tablouri indexate și cele asociative

un tablou poate reprezenta diverse structuri de date:


listă (vector), tablou asociativ – hash (implementarea
unei asocieri de valori – mapping), dicționar, colecție,
stivă, coadă,…
php: tipuri de date – compuse

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


array

// un tablou indexat (vector de valori) – sintaxa inițială


$cadouri = array ("ceas", "prăjitură", "colier", "topor");

// un tablou asociativ – perechi <cheie, valoare>


array ( "nume" => "Tux", "dimensiune" => 17, "oferta" => true );

// sintaxa simplificată – preferată (începând cu PHP 5.4)


[ "nume" => "Tux", "dimensiune" => 17, "oferta" => true ];
php: tipuri de date – compuse

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


object

instanță a unei clase

creat cu operatorul new


php: tipuri de date – speciale

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


resource

semnifică o referință la o resursă externă

exemplificări: bzip2, curl, ftp, gd, mysql link, mysql result,


pdf document, printer, stream, socket, xml, zlib

o resursă e creată de funcții specifice


e.g., resursa de tip stream inițiată de funcția fopen()
și folosită apoi de funcțiile fread(), feof(), fgets() etc.
php: tipuri de date – speciale

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


resource

semnifică o referință la o resursă externă

funcții predefinite:
is_resource()
get_resource_type()

detalii la www.php.net/manual/en/resource.php
php: tipuri de date – speciale

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


null

specifică valoarea null


reprezentând o variabilă care nu are valoare

funcții utile:
is_null()
unset()
php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Variabilele au nume compuse din litere, cifre și
caractere _ prefixate de simbolul $

pot stoca valori – aparținând unui tip de date –


sau referințe (specificate cu &)

www.php.net/manual/en/language.variables.php
php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Variabile create „din zbor”
tipul de date e determinat pe baza contextului

convertirea automată a tipului (type casting)


e similară celei de la limbajul C

$ani = 21; /* o variabilă de tip Int */


$conectat = true; # una de tip Boolean
$prefer["culoare"] = "gri"; // un tablou asociativ
$nume = 'Tux';

// comportament diferit privitor la substituția valorii efective

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// a unei variabile în funcție de delimitatorii folosiți
// pentru șirurile de caractere
echo "Salut $nume!\n";
echo 'Salut $nume!\n'; Salut Tux!
Salut $nume!\n

execuția online a codului PHP via instrumentul Web Ideone


php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcții predefinite utile:

var_dump()

settype()

is_bool(), is_int(), is_float(), is_array(), is_string()

is_scalar(), is_numeric()

…și altele
php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Vizibilitatea variabilelor (scope)

pentru a putea fi folosite în întreg programul,


variabilele trebuie declarate ca fiind globale

php.net/manual/en/language.variables.scope.php
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
$scor = 33; $scor = 33;

function oferaScor () { function oferaScor () {


echo "Scor curent: " . $scor; global $scor;
} echo "Scor curent: " . $scor;
// similar cu $GLOBALS["scor"]
oferaScor(); }

oferaScor();
Undefined variable:
scor in prog.php on line 4 Scor curent: 33
php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Vizibilitatea variabilelor (scope)

o variabilă poate fi declarată ca fiind statică

există doar în domeniul de vizibilitate local


(e.g., în cadrul unei funcții), dar nu-și pierde valoarea
atunci când execuția programului părăsește
acel domeniu de vizibilitate
php: variabile

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Eliberarea memoriei alocate se realizează automat
(garbage collection)

fiecare variabilă are asociat în memorie un container (zval)

vezi funcția xdebug_debug_zval() oferită de extensia Xdebug

www.php.net/manual/en/features.gc.php
php: variabile predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Variabile disponibile în întreg programul
(superglobals)

$GLOBALS [ ]
tablou asociativ ce conține referințe
la toate variabilele definite global
php: variabile predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


$_SERVER [ ]

$_GET [ ] $_POST [ ] $_FILES [ ] $_REQUEST [ ]

$_SESSION [ ]

$php_errormsg

$argc $argv

...
php: variabile predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


specifice
serverului Web
$_SERVER [ ]

$_GET [ ] $_POST [ ] $_FILES [ ] $_REQUEST [ ]


cereri HTTP
date despre $_SESSION [ ] ale clientului
sesiunea Web
$php_errormsg
mesaj de eroare
raportat
$argc $argv
argumente în
linia de comandă ...
php: constante

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Specificate cu define ( )

sunt disponibile la nivel global în program


define ( string $nume , mixed $valoare ) : bool

define ("DIMENS_MIN", 13);

www.php.net/manual/en/function.define.php
php: constante predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Exemplificări:

PHP_VERSION
PHP_OS
PHP_EOL
PHP_INT_MAX
PHP_INT_SIZE
DIRECTORY_SEPARATOR
true
false
null
php: constante predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Controlul manierei de raportare a erorilor:

E_ERROR erori fatale (execuția script-ului e oprită)


E_WARNING avertismente
E_PARSE erori de procesare a codului (parsing)
E_NOTICE notificări în timpul rulării
E_STRICT sugestii privind îmbunătățirea codului
E_DEPRECATED notificări despre aspecte demodate

www.php.net/manual/en/errorfunc.constants.php
www.phptherightway.com/#errors_and_exceptions
avansat

php: constante predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Mediul de execuție oferă acces la constante „magice”
ale căror valori pot fi folosite în cadrul programului

__LINE__
__FILE__
__DIR__
__FUNCTION__
__CLASS__
__TRAIT__
__METHOD__
__NAMESPACE__
php: operatori

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Majoritatea, similari celor din limbajul C

aritmetici: + - * / % ++ --
asignare a valorii: = și => (pentru tablouri)
referință: &
asignare prin referință: =&
pe biți: & | ^ << >>
comparații: == === != <> !== < > <= >= ?: ?? <=>
control al raportării erorilor: @
logici: and or xor ! && ||
șiruri de caractere (concatenare) – ca la Perl: . .=
php: operatori

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


În PHP 7+, se pot folosi și noii operatori:

<=> (spaceship)
compararea a două expresii (de tip scalar),
întorcând –1, 0 sau 1

echo 15.5 <=> 16.5; // -1 (mai mic)


echo 15.5 <=> 15.5; // 0 (egalitate)
echo 17.5 <=> 15.5; // 1 (mai mare)
php: operatori

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


În PHP 7+, se pot folosi și noii operatori:

?? (null coalescing)
oferă valoarea primului operand dacă există și nu e NULL,
altfel întoarce valoarea celui de-al doilea operand

// folosim ca nume de utilizator valoarea furnizată în formular


// (preluată prin GET sau POST); dacă nu există, va fi 'tux'
$username = $_GET['user'] ?? $_POST['user'] ?? 'tux';
php: structuri de control

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


if, switch, while, do, for, break, continue
asemănătoare celor din C

if (!$nume) {
echo ("Numele nu a fost furnizat…");
} else {
echo ("Bine ai venit, " . $nume . "!\n");
}
php: exemplu

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


<?php
// umplem un tablou cu valori de la 1 la 10
for ($index = 1; $index <= 10; $index++) {
$values[$index] = $values;
}
// realizăm suma valorilor
$sum = 0;
foreach ($values as $item)
$sum += $item;
/* afișăm suma obținută la ieșirea standard
pentru a fi trimisă clientului Web */
echo ("<p>Sum of first 10 numbers is <strong>" .
$sum . "</strong>.</p>");
?>
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
Invocarea (rularea) programului PHP direct
din linia de comandă:
salvăm codul într-un fișier text – values.php
apelăm interpretorul PHP din linia de comandă

php values.php
<p>Sum of first 10 numbers is <strong>55</strong>.</p>
Invocarea (rularea) programului PHP
la nivelul serverului Web:

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


plasăm fișierul sursă – cu drepturi de citire și execuție

în navigator, indicăm URL-ul către program


pentru a-l invoca via metoda GET a protocolului HTTP

rezultatul generat
de script
php: structuri de control

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Includerea de cod-sursă din alte fișiere
(suport pentru modularizare)

include
caută fișierul sursă în directoarele predefinite specificate
via include_path și-l evaluează

dacă fișierul nu există, se generează un avertisment

include_once – pentru a-l include o singură dată


php: structuri de control

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Includerea de cod-sursă din alte fișiere
(suport pentru modularizare)

require
caută fișierul sursă în directoarele predefinite specificate
via include_path și-l evaluează

dacă fișierul nu există, se emite o eroare fatală

require_once – pentru a-l include o singură dată


php: funcții

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcții definite de utilizator:

function trimiteMesaj ($exped="", $dest="", $subiect="Web") {


// corp...
parametri cu
} valori implicite

php.net/manual/en/language.functions.php
define ('MAX', 10); // numărul maxim de valori

function patrat ($numar) { // funcția de ridicare la pătrat

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


return $numar * $numar;
}

$numar = 0;
while ($numar < MAX) {
$numar++; // incrementăm numărul

if ($numar % 2) // e număr impar...


continue; // continuăm cu următoarea iterație
// e număr par, deci afișăm pătratul lui
echo "$numar la pătrat este " . patrat ($numar) . "\n";
}
php: funcții

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcții definite de utilizator:

numele funcțiilor sunt considerate case-insensitive

parametrii pot fi dați prin referință – prefixați de &

la PHP 5.6+, numărul variabil de parametri e indicat de …

php.net/manual/en/functions.arguments.php
Funcțiile sunt vizibile oriunde în program:
infomagic ();

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


function infomagic () {
printf("<p>Sunt <code>%s()</code> și execut linia %d
din <code>%s</code>.</p>", __FUNCTION__, __LINE__, __FILE__);
printf("<p>Folosesc PHP <code>%s</code> de pe <code>%s</code>
cu serverul Web <code>%s</code>.</p>",
PHP_VERSION, php_uname(), $_SERVER['SERVER_SOFTWARE']);
}
Funcțiile sunt vizibile oriunde în program:
infomagic ();

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


function infomagic () {
printf("<p>Sunt <code>%s()</code> și execut linia %d
din <code>%s</code>.</p>", __FUNCTION__, __LINE__, __FILE__);
printf("<p>Folosesc PHP <code>%s</code> de pe <code>%s</code>
cu serverul Web <code>%s</code>.</p>",
PHP_VERSION, php_uname(), $_SERVER['SERVER_SOFTWARE']);
}
 Sunt infomagic() și execut linia 15 din /opt/lampp/htdocs/magic.php.
Folosesc PHP 7.4.2 de pe Linux debian 4.9.0-11-amd64 #1 SMP
Debian 4.9.189-3+deb9u2 (2019-11-11) x86_64 cu serverul Web
Apache/2.4.41 (Unix) OpenSSL/1.1.1d PHP/7.4.2
mod_perl/2.0.8-dev Perl/v5.16.3.
<?php
declare (strict_types=1);
php: funcții
// argumentele trebuie să fie întregi, valoarea oferită trebuie să fie de tip int

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


function aduna (int ...$numere): int {
$suma = 0;
foreach ($numere as $numar) { 85
$suma += $numar; Fatal error: Uncaught TypeError:
} Argument 1 passed to aduna() must
return $suma; be of the type integer, float given
} Next TypeError: Argument 2 passed
to aduna() must be of the type
echo aduna (7, 3, 74, 1); integer, string given
echo aduna (pi (), '?');

pentru PHP 7+, se poate preciza și tipul de date


pentru fiecare argument, plus valoarea întoarsă de funcție
(scalar type declarations)
php: funcții

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


De la PHP 5.3, pot fi definite și funcții anonime
programare funcțională – e.g., closures

$saluta = function ($nume) { // variabilă de tip funcție


printf ("Salut %s...\n", $nume); // fără efecte colaterale
};

$saluta ('lumea');
$saluta ('Tuxy');

www.phptherightway.com/pages/Functional-Programming.html
php: funcții

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcțiile anonime se pot specifica prescurtat
de la versiunea PHP 7.4 (lansată în noiembrie 2019)

short closures
concept asemănător cu arrow functions
construcție funcțională disponibilă
în limbajul JavaScript (ECMAScript 6 – ES6)
declare (strict_types=1); // verificare strictă a tipurilor de date
header ('Content-type: text/plain'); // trimitem clientului text neformatat

// declararea prescurtată a unei funcții anonime

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// care are un argument de tip string la intrare și întoarce int
// variabilă de tip funcție: fn(argument) => corp
// (pentru corp, se permite o singură expresie; 'return' nu e permis)
$salută = fn(string $nume): int => printf("Salut %s! [la %s].\n",
$nume, date("j-m-Y H:i:s T", time()));
$salută('lume');
sleep (2); // se așteaptă 2 secunde...
$salută('Tuxy');

 Salut lume! [la 22-02-2021 01:37:59 PST].


Salut Tuxy! [la 22-02-2021 01:38:01 PST].
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


matematice și de conversie
de manipulare a șirurilor de caractere
de prelucrare a tablourilor
de acces la resurse și de lucru cu fișiere
de manipulare a bazelor de date
privitoare la conexiunile de rețea
criptografice
pentru accesarea resurselor XML, PDF, JPEG,...
specifice sistemului de operare
generale

detalii la php.net/manual/en/funcref.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Matematice:
abs(), mod(), fmod()
ceil(), floor(), round(), max(), min()
exp(), log10(), log()
pow(), sqrt()
sin(), cos(), tan(), asin(), …, sinh(), …, pi()
rand(), srand()
bindec(), octdec(), dechex(),…, base_convert()
is_finite(), is_infinite(), is_nan()

php.net/manual/en/refs.math.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Șiruri de caractere:
echo(), print(), printf(), sprintf() etc.
strlen(), chr(), ord(), substr(), strstr(), strpos(),…
strcmp(), strcasecmp(), strnatcmp() etc.
strcat(), str_replace(), str_ireplace(), strrev() etc.
trim(), ltrim(), rtrim()
explode(), implode(), split(), join(), strtok()
PHP 8: str_contains(), str_starts_with(), str_ends_with()
amănunte vizând procesarea textelor:
php.net/manual/en/refs.basic.text.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Expresii regulate:
conform standardului POSIX
ereg(), ereg_replace(), split() etc.

compatibile cu cele din Perl – PCRE: www.pcre.org


preg_filter(), preg_grep(), preg_match(), preg_split(),…

PHP 8+ (2020): noua construcție match()


www.php.net/manual/en/control-structures.match.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Tablouri:
array_count_values(), array_search(), array_filter(),
array_slice(), array_chunk()
array_fill(), array_combine(), array_shift(),
array_reverse(), array_multisort(), array_sum(),…
array_merge(), array_intersect(), array_diff()
array_keys(), array_key_exists()
array_push(), array_pop()
array_map(), array_reduce()

php.net/manual/en/book.array.php
/* filtrarea unor valori dintr-un tablou avansat
pe baza unei funcții specificate de programator */
php: funcții predefinite
function valoare_mai_mica_decat ($numar) {
// întoarce o expresie de tip funcție – closure: abordare funcțională

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


return function ($element) use ($numar) {
return $element < $numar;
};
}

$punctaje = [ 7, 8, 9, 10, 7.5, 3, 10, 8.75, 4 ];


// folosim funcția predefinită array_filter() asupra tabloului cu punctaje
// pentru a obține valorile mai mici decât o valoare dată (aici: 7)
$valori = array_filter ($punctaje, valoare_mai_mica_decat (7));

print_r ($valori); Array


(
[5] => 3
[8] => 4
a se studia și wiki.php.net/rfc/closures )
avansat
În PHP 7.4+ se poate folosi operatorul …
în cadrul tablourilor (asemănător cu ECMAScript 2018)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Array
(
[0] => C#
$web = [ 'JS', 'PHP' ]; [1] => JS
[2] => PHP
$mofturi = [ 'Lua', 'Rust', 'Scala' ]; [3] => Java
$limbaje = [ 'C#', ...$web, 'Java' ]; )
Array
print_r ($limbaje); (
[0] => Lua
// fuziune – similar cu array_merge() [1] => Rust
print_r ([ ...$mofturi, ...$web ]); [2] => Scala
[3] => JS
[4] => PHP
)
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Procesarea caracterelor:
ctype_digit(), ctype_xdigit(), ctype_print(),
ctype_punct(), ctype_space(),…
ctype_alpha(), ctype_alnum(), ctype_lower(),
ctype_upper()
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Dată & timp:
getdate(), localtime(), gettimeofday(), time() etc.
date(), idate(), gmdate(),…
checkdate()
strftime(), strtotime()

vezi și extensiile Calendar, DateTime, HRTime


php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Variabile PHP:
empty(), isset(), unset()
strval(), print_r(), var_dump()
serialize(), unserialize()

a se consulta și php.net/manual/en/book.var.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Fișiere și directoare:
folosind tipul de date FILE – ca la limbajul C:
fopen(), fread(), fscanf(), fgets(), fwrite(), fprintf(),
fseek(), ftell(), feof(), fclose(), ftruncate(), fstat(),...
file(), copy(), rename(), delete(),
move_uploaded_file(), tmpfile()
file_exists(), filesize(), filetype(), fileperms(),…, stat()
is_dir(), is_file(), is_readable(), is_writeable(),…
chdir(), mkdir(), rmdir()
disk_free_space(), disk_total_space()
de studiat și php.net/manual/en/refs.fileprocess.file.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


URL-uri:
urldecode(), urlencode(), parse_url()
base64_decode(), base64_encode()
http_build_query()
procesarea componentelor unui URL:
define('URL', 'http://undeva.info:8080/oferta/jucarii/produs/?nume=Tux&marime=17#oferta');
header('Content-type: text/plain'); // conținutul trimis clientului va fi text obișnuit

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// divizarea unui URL pe componente ale unui tablou asociativ
$adresaWeb = parse_url(URL);

foreach(array_keys($adresaWeb) as $componenta) {
printf("%s=%s\n", $componenta, $adresaWeb[$componenta]);
}
// procesăm șirul de interogare (query_string al URL-ului)
// fiecare parametru va fi stocat în tabloul $parametri
parse_str($adresaWeb['query'], $parametri);
if ($parametri['marime'] < 13) {
echo "Jucăria nu e în regulă...\n";
} else {
echo "Jucăria e bună (" . $parametri['marime'] . ")
și are numele " . $parametri['nume'] . ".\n";
}
procesarea componentelor unui URL:
define('URL', 'http://undeva.info:8080/oferta/jucarii/produs/?nume=Tux&marime=17#oferta');
header('Content-type: text/plain'); // conținutul trimis clientului va fi text obișnuit

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// divizarea unui URL pe componente ale unui tablou asociativ
$adresaWeb = parse_url(URL);

foreach(array_keys($adresaWeb) as $componenta) {
printf("%s=%s\n", $componenta, $adresaWeb[$componenta]);
}
// procesăm șirul de interogare (query_string al URL-ului)
// fiecare parametru va fi stocat în tabloul $parametri
parse_str($adresaWeb['query'], $parametri); scheme=http
host=undeva.info
if ($parametri['marime'] < 13) { port=8080
echo "Jucăria nu e în regulă...\n"; path=/oferta/jucarii/produs/
} else { query=nume=Tux&marime=17
echo "Jucăria e bună (" . $parametri['marime'] . ") fragment=oferta
și are numele " . $parametri['nume'] . ".\n"; Jucaria e în regulă (17)
} și are numele Tux.
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Prelucrarea resurselor Web (HTML, JSON):
nl2br(), htmlentities(), htmlspecialchars(), strip_tags()

get_browser(), show_source(), highlight_string(),...

json_encode(), json_decode(), json_last_error()


Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
(de)codificarea de date interne ↔ date JSON:

// piesele albumului 'Animals' de Pink Floyd (1977) exprimate în Unicode


$animals = [ "🐷 on the Wing #1", "Dogs 🐕",
[ "🐖🐖🐖" => "Pigs (Three Different Ones)" ],
"Sheep 🐑", "🐷 on the Wing #2" ];

$json = json_encode($animals); // codificăm (serializăm) în JSON

$animals2 = json_decode($json); // decodificăm datele JSON

// informații privind variabilele folosite


var_dump($animals, $animals2, $json);
$animals $animals2
array(5) { array(5) {
[0]=> [0]=>
string(19) "🐷 on the Wing #1" string(19) "🐷 on the Wing #1"

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


[1]=> [1]=>
string(16) "Dogs 🐕" string(16) "Dogs 🐕"
[2]=> [2]=>
array(1) { object(stdClass)#1 (1) {
["🐖🐖🐖"]=> ["🐖🐖🐖"]=>
string(27) "Pigs (Three Different Ones)" string(27) "Pigs (Three Different Ones)"
} }
[3]=> [3]=>
string(10) "Sheep 🐑" string(10) "Sheep 🐑"
[4]=> [4]=>
string(19) "🐷 on the Wing #2" string(19) "🐷 on the Wing #2"
} }

$json
string(191) "["\ud83d\udc37 on the Wing #1","Dogs \ud83d\udc15\u200d\ud83e\uddba",
{"\ud83d\udc16\ud83d\udc16\ud83d\udc16":"Pigs (Three Different Ones)"},
"Sheep \ud83d\udc11","\ud83d\udc37 on the Wing #2"]"
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport pentru operații criptografice:

password hashing – funcțiile password_*()


extensii utile
CSPRNG (generare de numere pseudo-aleatoare – la PHP 7+)
Hash (funcții hash_*() – de tip digest)
OpenSSL (funcționalități ce vizează SSL/TLS)
Sodium (operații de (de)criptare avansate – cazul PHP 7.2+)

amănunte la php.net/manual/en/refs.crypto.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport vizând conținutul grafic (raster/vectorial):

extensii preinstalate
Cairo – procesări vectoriale/raster: www.cairographics.org
EXIF – acces la meta-date JPEG
GD – prelucrări raster (GIF, JPEG, PNG): libgd.github.io
ImageMagick – procesări multi-format: www.imagemagick.org

php.net/manual/en/refs.utilspec.image.php
php: funcții predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Alte funcții utile:
die(), eval(), exit(), sleep(), usleep(), time_sleep_until()

uniqid(), sys_getloadavg()

php_info(), php_check_syntax()
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


SPL (Standard PHP Library)
acces la maniere standard de prelucrare a datelor
structuri de date definite:
SplStack, SplQueue, SplHeap, SplPriorityQueue,...

iteratori:
ArrayIterator, FilesystemIterator, RegexIterator etc.

www.php.net/spl
www.phptherightway.com/#standard_php_library
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Internaționalizarea & localizarea aplicațiilor
verificare lexicală (spelling): Enchant

suport pentru traducerea mesajelor: Gettext

internaționalizare (i18n – internationalisation): intl


clase: NumberFormatter MessageFormatter IntlDateFormatter
IntlTimeZone IntlCalendar Locale

www.php.net/manual/en/refs.international.php
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Alte extensii de bază preinstalate

în cazul PHP 7+, se pot folosi structuri de date eficiente

interfețe:
Collection Hashable Sequence

clase:
Vector Deque Map Pair Set Stack Queue PriorityQueue

www.php.net/manual/en/book.ds.php
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Alte extensii de bază preinstalate

YAML – suport pentru YAML Ain’t Markup Language


Swoole – acces la rețea: TCP, UDP, HTTP, WebSocket
Streams – lucrul cu fluxuri („șuvoaie”) de date
SeasLog – facilități pentru jurnalizare
GeoIP – localizare geografică
Parsekit – analizarea opcode-urilor PHP

www.php.net/manual/en/refs.basic.other.php
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Controlul execuției proceselor

extensii de interes
(unele disponibile doar pe sisteme Linux)

Eio, Ev, Expect, Libevent, PCNTL, POSIX, parallel,


pthreads, pht, Semaphore, Shared Memory, Sync

www.php.net/manual/en/refs.fileprocess.process.php
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Controlul execuției proceselor

rularea asincronă a codului se poate realiza


via biblioteci suplimentare

exemplificare:
ReactPHP
facilitează realizarea de operații asincrone – neblocante –
de intrare/ieșire asincrone bazate pe evenimente
reactphp.org
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Execuția programelor din linia de comandă
PHP CLI

php.net/manual/en/features.commandline.php
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


PHP ca modul al unui server Web (Apache, NGINX)

e.g., pe baza modulelor proxy_fcgi


și php-fpm (FastCGI Process Manager) – php-fpm.org

wiki.apache.org/httpd/php
www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


PHP 5.4+ oferă un server Web incorporat

exemplu de invocare:
php –S localhost:8000 –t phpwebapp/

php.net/features.commandline.webserver
avansat

php: alte facilități

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Inter-conectivitatea cu alte tehnologii/platforme

exemple de extensii:
V8js – procesarea și rularea codului JavaScript
via procesorul V8 (Google) folosit de Chrome și Node.js
www.php.net/manual/en/book.v8js.php

Lua + LuaSandbox – interpretarea programelor Lua


www.php.net/manual/en/book.luasandbox.php
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
Care-i suportul oferit de PHP
pentru programarea obiectuală?
php: caracterizare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Programare obiectuală
(object-oriented programming)
paradigmă bazată pe conceptul de obiect – incluzând
date (atribute, proprietăți) și cod (metode, proceduri)
uzual, obiectele interacționează între ele
și reprezintă instanțe de clase

exemple: Smalltalk (1972), Objective-C (1984),


C++ (1985), Python (1990), Java (1995), C# (2000)
php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport pentru definirea claselor via class
și de instanțiere prin operatorul new

obiectele sunt tratate similar referințelor


(o variabilă de tip obiect conține o referință la un obiect
și nu o copie a lui)

php.net/manual/en/oop5.intro.php
detalii la php.net/language.oop5
programare obiectuală – încapsularea
class Student { // specificarea unei clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// proprietăți (date-membre)
private $an;
private $email;
public $nume;
// metode publice
public function seteazaAn ($unAn) {
$this->an = $unAn;
}
public function furnizeazaAn () {
return $this->an;
}
}
$this este o pseudo-variabilă
specificând o referință la obiectul curent
programare obiectuală – încapsularea
class Student { // specificarea unei clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// proprietăți (date-membre)
private $an;
private $email; // instanțierea unui obiect
public $nume; $stud = new Student ();
// metode publice $stud->seteazaAn (2);
public function seteazaAn ($unAn) { $stud->nume = 'Tux';
$this->an = $unAn; print_r ($stud);
}
public function furnizeazaAn () { Student Object
return $this->an; (
} [an:Student:private] => 2
} [nume] => Tux
[email:Student:private] =>
)
php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Ca la C++, membrii – proprietăți sau metode –
pot fi declarați ca fiind

publici (public)
privați (private)
protejați (protected)
programare obiectuală – moștenirea
class StudentDestept extends Student {
private $note; // notele obținute (proprietate)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


public function seteazaNote ($n) {
$this->note = (array) $n;
}
public function furnizeazaNote () {
return (array) $this->note;
}
}

$altStud = new StudentDestept ();


// apel de metodă din clasa de bază
$altStud->seteazaAn (2);
// apel de metodă din clasa derivată
$altStud->seteazaNote (
['TW' => 10, 'IP' => 9]
);
programare obiectuală – moștenirea
class StudentDestept extends Student {
private $note; // notele obținute (proprietate)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


public function seteazaNote ($n) {
$this->note = (array) $n; print_r ($altStud);
}
StudentDestept Object
public function furnizeazaNote () {
(
return (array) $this->note; [note:StudentDestept:private]
} => Array
} (
[TW] => 10
$altStud = new StudentDestept (); [IP] => 9
// apel de metodă din clasa de bază )
$altStud->seteazaAn (2);
// apel de metodă din clasa derivată [an:Student:private] => 2
$altStud->seteazaNote ( [nume] =>
['TW' => 10, 'IP' => 9] [email:Student:private] =>
); )
php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Metode speciale:

constructorii sunt numiți __construct()

destructorii sunt denumiți __destruct()


php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Accesarea proprietăților/metodelor
statice, constante sau suprascrise

::
scope resolution operator (Paamayim Nekudotayim)

www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php
php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Accesarea proprietăților/metodelor
statice, constante sau suprascrise

::
self – clasa curentă
parent – clasa părinte
de la versiunea PHP 7.4 (2019) se poate specifica explicit
tipul de date al proprietăților definite de o clasă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


declare (strict_types=1);

class Student {
// proprietăți cu tip
private int $an;
private string $email;
public string $nume;
// etc.
} Fatal error: Uncaught TypeError:
Cannot assign bool to property
$stud = new Student (); Student::$nume of type string
$stud->nume = true;

instrument Web de testare: sandbox.onlinephpfunctions.com


php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Proprietățile sau metodele declarate cu static
pot fi accesate fără a fi nevoie de instanțierea clasei

pentru exemple, a se studia


www.php.net/manual/en/language.oop5.static.php
php: clase

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Se permit clase/metode abstracte declarate cu abstract

clasele abstracte nu pot fi instanțiate

orice clasă având măcar o metodă abstractă


este considerată abstractă

metodele abstracte trebuie implementate


în clasa copil (specificată cu extends) a clasei abstracte
php: interfețe

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Specificarea metodelor ce vor fi ulterior implementate
de o clasă (similar Java)

// interfața privind o machetă de vizualizare (template)


interface iMacheta {
// setează o variabilă ce va fi substituită
// cu valoarea ei în cadrul machetei
public function setVar ($nume, $var);
// furnizează reprezentarea machetei
public function oferaReprez ($macheta);
}
amănunte la php.net/manual/en/language.oop5.interfaces.php
// clasa implementând interfața
class Macheta implements iMacheta {
// tablou asociativ cu variabilele ce trebuie înlocuite cu valorile lor
private $variabile = array ();

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


public function setVar ($nume, $var) {
$this->variabile[$nume] = $var;
}

public function oferaReprez ($macheta) {


foreach ($this->variabile as $nume => $val) {
// substituim în machetă numele variabilelor cu valorile lor
$macheta = str_replace ('{' . $nume . '}', $val, $macheta);
}
return $macheta;
}
}
aspecte mai avansate: www.phptherightway.com/#templating
php: interfețe & clase predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Traversable
Iterator
IteratorAggregate
Throwable
ArrayAccess
Serializable
Closure
Generator

www.php.net/manual/en/reserved.interfaces.php
php: interfețe & clase predefinite

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// exemplificare: interfața Iterator
Iterator extends Traversable {

// metode ce trebuie scrise de programator


// în clasa ce implementează interfața
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}
php: introspecție

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Acces la informații vizând o clasă:

un program PHP poate obține date referitoare la clase,


interfețe, funcții, metode, extensii – reverse engineering

ReflectionClass implements Reflector

php.net/manual/en/book.reflection.php
php: introspecție

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


$clasa = new ReflectionClass ('StudentDestept');
// afișăm informații despre clasa specificată
printf ("<p>Clasa <em>%s</em> extinde %s
și e declarată în fișierul <tt>%s</tt>.</p>",
$clasa->getName (), var_export ($clasa->getParentClass (), 1),
$clasa->getFileName ());

Clasa StudentDestept extinde


ReflectionClass::__set_state(array( 'name' => 'Student', ))
și e declarată în fișierul /home/profs/busaco/html/php/introspect.php.
php: trăsături de clasă (traits)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Trait

concept preluat de la limbajul Self

oferit de PHP 5.4+

colecție de metode ce pot fi refolosite în cadrul altor clase

www.php.net/manual/en/language.oop5.traits.php
php: trăsături de clasă (traits)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Trait

considerat ca șablon (template C++) al unei clase

față de interfețe, oferă implementări ale metodelor,


nu doar signaturile lor

astfel, se oferă suport pentru pseudo-moștenire multiplă

aspecte formale: scg.unibe.ch/research/traits


// trăsături (comportamente) asociate unor figuri geometrice 2D
trait Rotire {
public function roteste ($unghi) { // implementează rotirea

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


}
}

trait Mutare {
public function mutaLa ($x, $y) { // mută la alte coordonate
}
}

trait Colorare {
public function coloreaza ($culoare) { // realizează colorarea
}
}
abstract class Figura { // clasa figurilor geometrice
public function deseneaza () {

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


echo ('Am desenat ' . get_class());
}
}

class Dreptunghi extends Figura {


// folosește trăsăturile dorite
use Colorare, Mutare, Rotire; // poate fi colorat, mutat, rotit

public function transforma () { // o transformare specifică


}
}
// clasa Cerc nu mai poate fi extinsă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


final class Cerc extends Figura {
// un cerc poate fi mutat și colorat
use Mutare, Colorare;

// declararea unei constante proprii


const PI = 3.1415265;

// specificarea unei metode proprii


public function calculeazaArie () {
}
}
php: trăsături de clasă (traits)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// instanțiem 2 figuri: un cerc și un dreptunghi
$unCerc = new Cerc ();
$unDreptunghi = new Dreptunghi ();
$unCerc->deseneaza ();
$unCerc->roteste (); // va cauza emiterea unei erori
$unDreptunghi->deseneaza ();

Am desenat Cerc


PHP Fatal error: Call to undefined method Cerc::roteste()
in /home/dMdWgn/prog.php on line 47
php: proprietăți speciale

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


O clasă are asociate proprietăți speciale („magice”)
ce pot fi suprascrise

__construct ()
__destruct ()

__toString ()

__get ()
__set ()

altele la www.php.net/manual/en/language.oop5.magic.php
php: obiecte

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Obiectele pot fi „clonate” via clone

Obiectele se pot compara folosind operatorul ===


php: obiecte

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcții de manipulare a claselor și obiectelor
get_class() va returna numele unui obiect,
instanță a unei clase
get_parent_class() furnizează clasa părinte
din care provine un anumit obiect
method_exists() testează dacă există o metodă
pentru un anumit obiect specificat
class_exists() testează existența unei clase
is_subclass_of() determină dacă există o relație
de moștenire dintre două clase
php: excepții

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


try catch throw

clasa Exception

similare celor din Java

detalii la www.php.net/manual/en/language.exceptions.php
php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

declarare cu namespace (prima linie de program)


php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

declarare cu namespace (prima linie de program)

exemplu: namespace Facebook; // Facebook SDK for PHP

de aprofundat www.phptherightway.com/#namespaces
php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

același spațiu de nume poate fi definit în fișiere multiple

pot exista ierarhii de (sub-)spații de nume

namespace Proiect\Modul\Submodul;
referire cu
class GenSVG { ... }; Proiect\Modul\Submodul\GenSVG
php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

utilizare prin use (eventual specificând un alias)

use Proiect\Modul\Submodul;
php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

utilizare prin use (eventual specificând un alias)

use Proiect\Modul\Submodul;

exemple concrete:
use Facebook\Authentication\AccessToken;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
php: spații de nume

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosite pentru evitarea coliziunilor de nume și
pentru efectuarea de alias-uri

construcțiile care nu aparțin niciunui spațiu de nume


definit sunt considerate ale spațiului de nume global

namespace ProiectWeb;
function cosh () { // specificarea unei funcții proprii
...
$valoare = \cosh (...); // apel de funcție predefinită (din spațiul global)
}
Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
Care sunt facilitățile
vizând interacțiunea Web?
php: interacțiune web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Datele de la client (browser) se regăsesc
în tablouri asociative predefinite (și globale):
$_GET[ ] – datele transmise prin metoda GET
$_POST[ ] – datele expediate prin POST
$_COOKIE[ ] – cookie-urile receptate
$_REQUEST[ ] – datele primite de la client
(conținutul lui $_GET, $_POST și $_COOKIE)
$_SESSION[ ] – datele referitoare la sesiunile Web
php: interacțiune web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Alte variabile globale utile:

$_SERVER[ ]
oferă informații privind serverul Web

$_SERVER['PHP_SELF'] indică numele script-ului PHP


$_SERVER['REQUEST_METHOD'] – metoda HTTP folosită
$_SERVER['HTTP_REFERER'] – URL-ul referind resursa
$_SERVER['HTTP_USER_AGENT'] – detalii despre client

www.php.net/manual/en/reserved.variables.server.php
php: interacțiune web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Alte variabile globale utile:

$_ENV[ ] – date despre mediul (environment) de execuție

$_FILES[ ] – datele despre fișierele primite prin upload


www.php.net/manual/en/features.file-upload.php

vezi exemplul din arhiva


aferentă prelegerii
<!-- un formular Web modelat în HTML -->
<form action="afiseaza.php" method="post">
<input type="text" name="nume" />

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


<input type="text" name="varsta" />
<input type="submit" value="Trimite" />
</form>
<!-- un formular Web modelat în HTML -->
<form action="afiseaza.php" method="post">
<input type="text" name="nume" />

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


<input type="text" name="varsta" />
<input type="submit" value="Trimite" />
</form>

<?php
// programul afiseaza.php invocat prin POST
if (!$_REQUEST["nume"])
echo ("Nu ați specificat numele!");
else
echo ("Numele este" . $_REQUEST["nume"]);
?>
fiecare nume de câmp din formular reprezintă
o cheie a tabloului asociativ $_REQUEST [ ]
(în funcție de metoda HTTP, poate fi regăsit în $_GET sau $_POST)
php: cookie-uri – creare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stabilirea unui cookie via funcția setcookie ()
setcookie ( string $nume_cookie
[, string $valoare = "" [, int $timp_expirare = 0
[, string $cale = "" [, string $domeniu = ""
[, bool $transf_securiz = false [, bool $doar_http = false ]]]]]] ) : bool
php: cookie-uri – creare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Stabilirea unui cookie via funcția setcookie ()
setcookie ( string $nume_cookie
[, string $valoare = "" [, int $timp_expirare = 0
[, string $cale = "" [, string $domeniu = ""
[, bool $transf_securiz = false [, bool $doar_http = false ]]]]]] ) : bool

// persistent – stabilim ca acest cookie să expire peste 10 zile


setcookie ('culoare', 'tan', time() + 60 * 60 * 24 * 10);
// nepersistent – de ce?
setcookie ('autentificat', 'true');
php: cookie-uri – expirare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Eliminarea unui cookie:
se anulează valoarea și timpul;
eventual, celelalte atribute ale cookie-ului

setcookie ($nume_cookie, "", 0, "/", "");

detalii la www.php.net/manual/en/function.setcookie.php
php: cookie-uri – consultare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Cookie-ul e specificat (accesat) ca o variabilă
de tip tablou asociativ – $_COOKIE ['nume_cookie']

<!-- culoarea de fundal e dată de valoarea cookie-ului


stabilită anterior --> vezi arhiva
<style> exemplelor PHP
body {
background: <?php echo $_COOKIE['culoare']; ?>
}
</style>
php: sesiuni web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Managementul sesiunilor: funcțiile session_start(),
session_register(), session_id(), session_unset(), session_destroy()

session_start (); // inițiem o sesiune Web


if (!isset ($_SESSION['accesari'])) {
variabila
$_SESSION['accesari'] = 0; } accesari atașată
else { sesiunii

$_SESSION['accesari']++; }

detalii la php.net/manual/en/book.session.php
php: sesiuni web

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Managementul sesiunilor: clasa SessionHandler
SessionHandler implements SessionHandlerInterface {
public bool open ( string $save_path , string $session_name ) : bool
public string create_sid ( void ) : string
public string read ( string $session_id ) : string
public bool write ( string $session_id , string $session_data ) : bool
public bool gc ( int $maxlifetime ) : int // elimină vechile sesiuni
public bool destroy ( string $session_id ) : bool
public bool close ( void ) : bool
}
php.net/manual/en/book.session.php
(în loc de) pauză

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Cum pot fi accesate bazele de date din PHP?

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


php: bd

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Suport nativ pentru o multitudine
de servere/tehnologii de baze de date:

MongoDB – clasele MongoDB MongoClient MongoCursor


MySQL / MariaDB – clasa mysqli
PostgreSQL – funcțiile pg_*()
SQLite – clasa SQLite3
etc.

conexiunile pot fi persistente


php: bd – mysql

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Funcții/metode pentru acces la MySQL/MariaDB
conectare la server: mysql_connect (), mysql_pconnect ()
selectare (utilizare) bază de date: mysql_select_db ()
execuția unei interogări: mysql_query ()
raportare de erori: mysql_errno (), mysql_error ()
preluarea rezultatelor într-un tablou: mysql_fetch_array ()
multe altele…

actualmente, abordare depreciată – eliminată în PHP 7


php: bd – extensia mysqli

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Scop: acces usor și flexibil la MySQL/MariaDB
din programele PHP5+

aborare procedurală sau obiectuală


facilitează mentenabilitatea codului

compatibilitate cu API-ul MySQL

asigură securitatea și performanța

documentații disponibile la www.php.net/mysqli


php: bd – extensia mysqli

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Metode importante:

inițierea unei conexiuni cu serverul MySQL – mysqli ( )


interogări SQL – query ( ), prepare ( ), execute ( )
procesarea răspunsului – fetch ( ), fetch_assoc ( )
închiderea conexiunii – close ( )
etc.
php: bd – exemplu

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pentru început, vom crea un cont de utilizator MariaDB
care va asigura acces autentificat clienților – în acest caz,
programe PHP – asupra bazei de date students
disponibilă pe serverul MariaDB
(consola)$ mysql -u root -p mysql
Enter password: **********
Welcome to the MariaDB monitor. Commands end with ; or \g.
Server version: 10.4.11-MariaDB Source distribution

MariaDB [mysql]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE,


DROP ON students.* TO 'tux@localhost' IDENTIFIED BY 'p@rola’
WITH GRANT OPTION;
Query OK, 0 rows affected (0.001 sec)
php: bd – exemplu

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Folosind clientul mysql în linia de comandă sau
o aplicație Web de administrare creăm tabela students
având structura:

+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| name | varchar(50) | NO | | NULL | |
| year | enum('1','2','3') | NO | | NULL | |
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| age | tinyint(3) unsigned | NO | | NULL | |
+-------+---------------------+------+-----+---------+----------------+
pentru administrare facilă, recurgem la instrumentul Web
Adminer – www.adminer.org

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


vizualizarea/alterarea structurii tabelei create

alternativă: phpMyAdmin – www.phpmyadmin.net


datelor
exportul
înregistrări
inserarea de

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
execuția
manuală de
comenzi SQL

istoricul
interogărilor
php: bd – extensia mysqli

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// instanțiem obiectul mysqli
$mysql = new mysqli ('localhost', 'tux', 'p@r0la', 'students');
if ( mysqli_connect_errno () ) {
die ('Conexiunea a eșuat...');
}

// formulăm o interogare și o executăm


if (!($rez = $mysql->query ('select name, year from students'))) {
die ('A survenit o eroare la interogare');
}
php: bd – extensia mysqli

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


// instanțiem obiectul mysqli
$mysql = new mysqli ('localhost', 'tux', 'p@r0la', 'students');
if ( mysqli_connect_errno () ) {
!!!
die ('Conexiunea a eșuat...');
}

// formulăm o interogare și o executăm


if (!($rez = $mysql->query ('select name, year from students'))) {
die ('A survenit o eroare la interogare');
}
Parola e dată „în clar”!
atenție la probleme de securitate ce pot surveni
// generăm o listă numerotată cu datele despre studenți
// (cod HTML în stil spaghetti – practică nerecomandată!)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


echo ('<ol>');
// rezultatele sunt disponibile într-un tablou asociativ
while ($inreg = $rez->fetch_assoc ()) {
// coloană a tabelei ≡ cheie a tabloului
echo ('<li>Studentul ' . $inreg['name'] .
' este în anul ' . $inreg['year'] . '</li>');
}
echo ('</ol>');

// închidem conexiunea cu serverul MySQL/MariaDB


$mysql->close ();
php: bd

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


În practică, se recurge la un strat de abstractizare
a accesului la sistemul de stocare

DBAL – DataBase Abstraction Layer

abordare uzuală:
PDO (PHP Data Objects)

aspecte pragmatice în tutorialul phpdelusions.net/pdo


// datele de conectare la serverul de baze de date MySQL/MariaDB
$host = '127.0.0.1';
$db = 'students';
php: bd – extensia pdo
$user = 'tux';

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


$pass = 'p@r0la'; // atenție: parola e specificată „în clar”!
$charset = 'utf8';

// stabilirea numelui sursei de date: DSN (Data Source Name)


$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

// opțiuni vizând maniera de conectare


$opt = [
// erorile sunt raportate ca excepții
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// rezultatele vor fi disponibile într-un tablou asociativ
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// conexiunea e persistentă
PDO::ATTR_PERSISTENT => true
];
php.net/manual/en/book.pdo.php
// preluăm de la clientul Web anul de studii (implicit: 2)
$year = $_REQUEST['year'] ? $_REQUEST['year'] : 2;
php: bd – extensia pdo
try {

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


$pdo = new PDO ($dsn, $user, $pass, $opt); // instanțiem un obiect PDO

// pregătim comanda SQL parametrizată


$sql = $pdo->prepare ('SELECT year, name, age FROM students
WHERE year=? ORDER BY age');

if ($sql->execute ([ $year ])) { // comanda SQL poate fi executată?


while ($row = $sql->fetch ()) { // ...preluăm fiecare înregistrare găsită
// ...și o afișăm (coloana tabelei este cheie a tabloului asociativ)
echo '<p>' . $row['name'] . ' e în anul ' . $row['year'] . '</p>';
}
}
} catch (PDOException $e) {
echo "Eroare: " . $e->getMessage(); // mesajul excepției survenite
};
php: bd – extensia pdo

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Un posibil rezultat oferit de execuția
programului PHP invocat via un URL precum
https://profs.info.uaic.ro/~/busaco/php/pdo-test.php?year=2

Tuxy Pinguinesscool e în anul 2


Grace Hopper e în anul 2
Margaret Hamilton e în anul 2

de studiat exemplul din


arhiva aferentă prelegerii
avansat

php: bd

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Uzual, peste DBAL se va putea folosi o soluție
(i.e. framework, componentă, bibliotecă,…)
de tip ORM – Object-Relational Mapping

exemple:
Doctrine – www.doctrine-project.org
Propel – propelorm.org
RedBeanPHP – redbeanphp.com
Instrumente utile pentru dezvoltatorii Web?

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


avansat

instrumente: framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Facilități:

MV* și diverse șabloane de proiectare

acces la baze de date (ORM, DAO, ActiveRecord,…)

validare și filtrare a datelor de intrare

autentificare + controlul accesului

management de cookie-uri și sesiuni Web


avansat

instrumente: framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Facilități:

machete de prezentare a datelor – templating

suport pentru performanță – i.e. caching

transfer asincron de date (Ajax, Web Socket)

suport pentru servicii Web și API-uri REST/GraphQL

extensibilitate – e.g., module create de programator și


gestionate cu utilitarul Composer
avansat

instrumente: framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


program models

🗎
.php
routing security appli- libraries
cation
helpers
caching view con-
troller plugins
others

fluxuri de activități realizate de un framework Web


avansat

instrumente: framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


CakePHP – cakephp.org
CodeIgniter – codeigniter.com
FuelPHP – fuelphp.com
Laminas (ex-Zend Framework) – docs.laminas.dev
Laravel – laravel.com
Nette – nette.org
Phalcon – phalcon.io
PRADO – www.pradoframework.net
Symfony – symfony.com + Symfony Flex – flex.symfony.com
Yii – www.yiiframework.com
├───Config
│ └───Boot avansat
├───Controllers

instrumente: framework-uri
├───Database
├───Migrations

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


│ └───Seeds
├───Filters
├───Helpers
├───Language
│ ├───en
│ └───ro
├───Libraries
├───Models
├───ThirdParty
└───Views
└───errors
├───cli
└───html
structura de directoare
a unei aplicații Web dezvoltate
cu un framework axat pe MVC

CodeIgniter 4
codeigniter.com/docs
├───app
│ ├───Commands avansat
│ ├───Console

│ instrumente: framework-uri
├───Events
├───Exceptions

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


│ ├───Handlers
│ ├───Http
│ ├───Providers
│ ├───Services
│ └───User.php
├───bootstrap
│ ├───app.php
│ └───autoload.php
├───config
├───database
│ ├───migrations
│ └───seeds
├───public
├───resources structura de directoare
│ ├───assets
│ ├───lang a unei aplicații Web dezvoltate
│ └───views
├───server.php
via framework-ul Laravel
├───storage
└───tests
laravel.com/docs/
laracasts.com/skills/php
avansat

instrumente: micro-framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Un micro-framework reprezintă
un cadru de lucru Web minimalist
avansat

instrumente: micro-framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Un micro-framework reprezintă
un cadru de lucru Web minimalist

nu include, uzual, facilități sofisticate

deseori, axat asupra unui singur aspect vizând


dezvoltarea Web – e.g., crearea unui API, microserviciu,…
avansat

instrumente: micro-framework-uri

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Fat-Free – fatfreeframework.com
Flight – flightphp.com
Fresh Squeezed Limonade – github.com/yesinteractive/fsl
Leaf PHP – leafphp.netlify.app
Lumen – lumen.laravel.com
Slim – www.slimframework.com
Siler – siler.leocavalcante.dev
avansat

instrumente: pachete

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Managementul dependențelor
dintre biblioteci și pachete

Composer
getcomposer.org

www.phptherightway.com/#dependency_management
avansat
Meta-datele + dependențele de alte (versiuni de) pachete
sunt specificate în fișierul composer.json

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


{
"name": "organizație/pachet",
"version": "1.3.74" // versiunea curentă a pachetului
"license": [ "LGPL-2.1-only", "GPL-3.0-or-later" ], // licența de utilizare
"authors": [ { "name": "Tuxy", "role": "Developer" } ], // autor(i)
"require": {
"php" : "^5.5 || ^7.0", // versiunile PHP necesare execuției codului
"spațiu-de-nume/altpachet": "~2.0", // versiunea dependenței externe
"organizație/pachet2": "*" // alt pachet propriu
},
"repositories": [ // sursa de unde poate fi preluat pachetul
{ "type": "composer", "url": "http://packages.some.where" } ]
}
se recurge la Composer
(alte valori: git, vcs, pear, package)
avansat

instrumente: pachete

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pachetele sunt încapsulate în arhive PHAR (PHP Archive) și
pot fi publice/private
avansat

instrumente: pachete

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pachetele sunt încapsulate în arhive PHAR (PHP Archive) și
pot fi publice/private
php composer.phar comandă
unde comandă poate fi:
install – instalare locală/globală inclusiv a dependențelor
update – actualizare de pachete
remove – eliminarea pachetelor
search – căutarea unui pachet
show – afișarea tuturor pachetelor disponibile
depends – afișarea pachetelor ce depind de un pachet specific
help – oferirea de informații de ajutor
…și altele
avansat

instrumente: pachete

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Pachetele publice se pot prelua de pe Web de la
Packagist – depozit de pachete (repository)

packagist.org
avansat

instrumente: pachete

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Managementul dependențelor
dintre biblioteci și pachete
alternativă – mai veche:
PEAR (PHP Extension and Application Repository)
pear.php.net
+
extensii oferite de terți:
PECL (PHP Extension Community Library)
pecl.php.net
instrumente: medii de dezvoltare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Medii pre-configurate pentru dezvoltare Web
server Web + PHP + server(e) de baze de date + utilitare
instrumente: medii de dezvoltare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Apache + PHP 7 +
MySQL/MongoDB…
AMPPS
www.ampps.com
XAMPP
www.apachefriends.org
cu suport pentru
diverse configurări
de sisteme Web
(extensii)
instrumente: medii de dezvoltare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Nginx + PHP7 + MariaDB +
Redis + unelte de administrare
WinNMP – winnmp.wtriple.com
instrumente

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


medii de dezvoltare (și pentru) PHP „în nori”
disponibile direct în navigatorul Web
AWS Cloud9, Codenvy, Koding, REPL.it,…
instrumente: execuție online

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


editarea și execuția online a programelor PHP
Ideone – ideone.com
PhpFiddle – phpfiddle.org
instrumente: execuție online

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Editarea și execuția online a programelor PHP

pentru testarea rapidă a codului, a se considera:

PHP Sandbox – sandbox.onlinephpfunctions.com

PHPTester – phptester.net
instrumente: execuție online

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


pentru teste vizând bazele de date relaționale,
de experimentat DB Fiddle – www.db-fiddle.com
și/sau SQL Fiddle – sqlfiddle.com

de studiat și Industry-specific Data Models


www.databaseanswers.org/data_models/
inclusiv SQL Zoo – sqlzoo.net
instrumente: documentare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Generarea automată a documentației unei aplicații

Daux – daux.io
phpDocumentor – www.phpdoc.org
phpDox – phpdox.de

github.com/ziadoz/awesome-php#documentation
instrumente: documentare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Marcaje (adnotări) speciale în comentariile PHP:
@author @var @example
@category @global @source
@version @method @uses
@copyright @package @used-by
@license @subpackage @link
@see @param @internal
@todo @return @property
@since @throws @property-read
@deprecated @inheritdoc @property-write
docs.phpdoc.org/references/phpdoc/
instrumente: analizarea codului-sursă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Analizarea statică a codului-sursă PHP

pentru descoperirea de greșeli de programare (bugs),


verificarea adoptării unor stiluri de redactare
(coding standards), corectare automată (fixers),
determinarea de metrici (metrics):
complexitate, linii de cod,…

github.com/exakat/php-static-analysis-tools
avansat

instrumente: analizarea codului-sursă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


PHP Standards Recommendations – www.php-fig.org/psr/
redactate de PHP FIG (Framework Interop Group)
PSR1: Basic Coding Standard, PSR3: Logger Interface,
PSR4: Autoloading Standard, PSR6: Caching Interface,
PSR7: HTTP Message Interface, PSR11: Container Interface,
PSR12: Extended Coding Style Guide,
PSR13: Hypermedia Links, PSR14: Event Dispatcher,
PSR15: HTTP Handlers,

instrumente: PHP_CodeSniffer, PHP-CS-Fixer
instrumente: analizarea codului-sursă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


PSR12: Extended Coding Style Guide – exemple de reguli:
All PHP files MUST use the Unix LF (linefeed) line ending only.
The closing ?> tag MUST be omitted from files containing only PHP.
Lines SHOULD NOT be longer than 80 characters.
There MUST NOT be more than one statement per line.
All PHP reserved keywords and types MUST be in lower case.
Visibility MUST be declared on all properties and methods.
There MUST be one space after the control structure keyword.

www.php-fig.org/psr/psr-12/
instrumente: analizarea codului-sursă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


rapoarte oferite de phptools.online/php-checker
avansat

instrumente: testare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


atoum – atoum.org
Codeception – codeception.com
ParaTest (testare paralelă) – github.com/brianium/paratest
Peridot – peridot-php.github.io
PHPUnit – phpunit.de
SimpleTest – github.com/simpletest/simpletest

altele la github.com/ziadoz/awesome-php#testing
avansat

instrumente: testare

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Profiling – analizarea și raportarea
fragmentelor de cod care se execută lent

PhpBench – github.com/phpbench/phpbench
Tracy – tracy.nette.org
Xdebug extension for PHP – xdebug.org/docs/profiler
XHGui (bazat pe XHProf) – github.com/perftools/xhgui
Z-Ray – www.zend.com/en/products/server/z-ray

github.com/ziadoz/awesome-php#debugging-and-profiling
avansat

instrumente: integrare continuă

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


CircleCI – circleci.com
PHPCI – github.com/dancryer/phpci
Sismo – sismo.symfony.com

github.com/ziadoz/awesome-php#continuous-integration
avansat

extensii

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Hack (Facebook, din 2014)
limbaj de programare pentru HHVM, extinzând PHP

scop: creșterea productivității dezvoltatorului Web

facilități: tipuri de date explicite (type annotations),


generics, expresii λ, programare asincronă (async) și altele

hacklang.org
critici majore

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


mulți ani: lipsa unei specificații formale a limbajului
actualmente: github.com/php/php-langspec
inconsistență – e.g., foreach, nume de funcții predefinite
lipsa suportului nativ pentru Unicode (exceptând PHP 7+)
lipsa suportului nativ pentru multi-threading,
însă posibil via extensii ca pthreads et al.
critici majore

PHP Sadness – phpsadness.com

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


critici majore

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


În PHP se pot ușor crea aplicații
ce „adoptă” anti-pattern-ul Spaghetti Code
interfața
critici majore Web

Buragaprofs.info.uaic.ro/~busaco/
HTML

github.com/hanafiah/masterphp/tree/master/spaghetti
PHP pentru acces
la date via SQL
și procesări

PHP pentru
prezentarea datelor

Dr. Sabin
studiu de caz: Wikipedia
Jimmy Wales & Larry Sanger (2001)

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


studiu de caz: wikipedia

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Scop: oferirea de conținut deschis
via o suită de aplicații Web colaborative – wiki-uri

Wikipedia Foundation
menține Wikipedia, Wiktionary, Wikibooks, Wikiquote,
Wikivoyage, Wikisource, Wikimedia Commons,
Wikispecies, Wikinews, Wikiversity, Wikidata
en.wikipedia.org/wiki/Wikimedia_Foundation
studiu de caz: wikipedia

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Versiune complexă a stivei de tehnologii LAMP
MediaWiki – sistemul wiki utilizat pentru toate serviciile
implementat în PHP 7.3 + JavaScript
MariaDB (soluția principală de stocare – din 2013)
ImageMagick, DjVu, TeX, rsvg, ploticus etc.
(pentru procesare de conținuturi grafice în MediaWiki)
Apache HTTP Server + Nginx (servere Web)

se oferă inclusiv un API destinat dezvoltatorilor Web:


www.mediawiki.org/wiki/API:Main_page
avansat

studiu de caz: wikipedia

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


PHP-FPM (FastCGI Process Manager for PHP)
Apache Traffic Server + Varnish (proxy + caching)
Memcached (caching interogări asupra bazelor de date)
Elasticsearch (căutare textuală – implementare Java)
gdnsd (soluție C++ pentru DNS)
Apache Kafka (streaming de evenimente – Java + Scala)
Linux Virtual Server (load balancing); PyBal (monit. locală)
Debian GNU/Linux (sistem de operare)
Icinga + Grafana (monitorizarea stării sistemelor)
Phabricator (raportarea deficiențelor – bug tracking)

meta.wikimedia.org/wiki/Wikimedia_servers
avansat

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


găzduire principală:
SUA, Virginia
găzduire secundară:
SUA, Texas
replicare (caching):
Europa, Amsterdam
SUA, San Francisco
Asia, Singapore
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Numeroase situri Web recurg la sisteme de management
al conținutului (CMS – Content Management System)
concepute în PHP

generale:
Drupal, Joomla, WordPress etc.
CMS-urile pot include
studii de caz
extensii + teme vizuale

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


inspectarea tehnologiilor
folosite de o aplicație Web
cu instrumentul WhatRuns
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


inspectarea tehnologiilor
folosite de o aplicație Web
cu instrumentul WhatRuns
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Numeroase situri Web recurg la sisteme de management
al conținutului (CMS – Content Management System)
concepute în PHP

de tip wiki:
DokuWiki, MediaWiki, pmWiki etc.
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Numeroase situri Web recurg la sisteme de management
al conținutului (CMS – Content Management System)
concepute în PHP

specifice comerțului electronic:


Magento, OpenCart, PrestaShop,…
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


inspectarea tehnologiilor folosite de o aplicație Web
cu instrumentul WhatRuns
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


Numeroase situri Web recurg la sisteme de management
al conținutului (CMS – Content Management System)
concepute în PHP

facilitând discuții online (message board, forum Web):


bbPress, esoTalk, phpBB,…
studii de caz

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


inspectarea tehnologiilor folosite de o aplicație Web
cu instrumentul WhatRuns
rezumat

Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/


privire generală asupra PHP

._ |_ ._
|_)| ||_)
| |

caracterizare, facilități, instrumente, exemple


Dr. Sabin Buragaprofs.info.uaic.ro/~busaco/
episodul viitor:
un model de date pentru Web: familia XML

S-ar putea să vă placă și