26
aa 2019/2020 1 la componente server‐side: introduzione a PHP Goy ‐ a.a. 2019/2020 1 Tecnologie Web: approcci avanzati Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 2

la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

1

la componente server‐side: introduzione a 

PHP

Goy ‐ a.a. 2019/2020 1Tecnologie Web: approcci avanzati

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 2

Page 2: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

2

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 3

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 4

Page 3: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

3

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 5

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 6

Page 4: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

4

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 7

PHP...• è un linguaggio di programmazione per il web nato nel 1995

• è utilizzato da più dell'80% dei siti web nel mondo secondo (Zimuel 2017),  83,5%  secondo w3techs.com (luglio 2018), tra cui: Wordpress, Drupal, Joomla!, Magento, WikiMedia

• è interpretato (da un interprete PHP)

• è server‐side (cioè interpretato ed eseguito sul server)

• è supportato da tutti i principali web server (Apache, Nginx, IIS, ...) e può essere eseguito anche da linea di comando (utilizzando una speciale versione dell'interprete chiamata CLI – Command Line Interface)

• a fianco dell'interprete ci sono moltissime estensioni (moduli) con funzionalità specifiche, per es. accesso a database ( è possibile implementare nuovi moduli con funzionalità specifiche), utilizzando la Zen API (in C)

Note sparse su PHP ‐ I

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 8

• nella versione 7 il motore è stato completamente re‐implementato, migliornadone significativamente le prestazioni

Note sparse su PHP ‐ II

Page 5: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

5

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 9

• esistono moltissimi framework di sviluppo (open source), x es: Zend Framework, Symfony, Laravel, CodeIgniter, Yii, CakePHP, Phalcon, Slim, ... (un articolo comparativo sui framework x PHP: www.intraweb.it/confronto‐migliori‐framework‐mvc‐php‐2017)

• la memoria viene rilasciata a fine esecuzione (tipicamente, dopo una HTTP request/response) – no garbage collection

• è debolmente tipato (anche se è stata introdotta, nella v. 7, la possibilità di dichiarare i tipi degli input/output delle funzioni) e le variabili non devono essere dichiarate

• il deploy di una web app è semplicissimo: basta copiare tutti i file (pagine, immagini, css, ecc.) nella document root del server!

• PHP = PHP Hypertext Preprocessor  il sorgente è contenutodirettamente nella pagina web...

Note sparse su PHP ‐ III

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 10

Applicazione web scritta in PHP = insieme di "pagine web", cioè file di testo, con estensione .php, che contengono:

– Codice HTML (+ eventualmente Javascript client‐side)

– Codice PHP = programma (script) server‐side

Esempio:

<H1> PHP: esempio </H1>

<?php$id = $_POST["login"];$pwd = $_POST["password"];if ($id == "admin" && $pwd == "pippo") {echo "<P>Benvenuto amministratore!</P>";}else {echo "<P>Buongiorno ".$id."</P>";}

?><P>Questa è una pagina web dinamica</P>

programmma (script) PHP: interpretato dall'interprete PHP, sul server 

Come funziona PHP ‐ I

HTML: interpretato dal browser

HTML: interpretato dal browser

[h]

[p]

[h]

Page 6: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

6

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 11

Cosa succede quando il browser invia una HTTP request al server basata su un URL del tipo: http://www.di.unito.it/dida.php?

• Il Web Server si accorge, grazie all'estensione del file indicato nell'URL, che la risorsa richiesta è una pagina PHP (dida.php)  gira l'HTTP request all'interprete PHP

• l'interprete PHP interpreta (ed esegue) gli script [p] contenuti nella pagina indicata nell'HTTP request; tipicamente, alcune istruzioni PHP gli diranno di:– leggere i dati (parametri) contenuti nell'HTTP request; x es:

$id = $_GET["username"]; opp $id = $_POST["username"];

– connettersi ad un database (per leggere o scrivere dati); x es:$r = $db->query("SELECT * from libri WHERE titolo = '$tit'");

• L'esecuzione dello script PHP produce un risultato, tipicamente del testo o del codice HTML, che viene inserito nella pagina al posto dello script

Come funziona PHP ‐ II

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 12

• La pagina risultante, composta dall'HTML originario [h] + il risultato dell'esecuzione dello script, viene inviata al browser (nel body dell'HTTP response)

• Tipicamente:

L.                 A.                        M.                               P. 

Linux (www.linuxfoundation.org)Apache (www.apache.org)MySQL (www.mysql.com) o MariaDB (mariadb.org)PHP (www.php.net)

NB: sono possibili combinazioni diverse... per es:Windows + Apache + MySQL/MariaDB + PHP = W.A.M.P.Mac OS +  Apache  +  MySQL/MariaDB  +  PHP = M.A.M.P.

Come funziona PHP ‐ III

sistema operativo

web server DBMS interprete scriptserver‐side

Linux Apache MySQL/MariaDB PHP

tutte tecnologieOpen Source

Page 7: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

7

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 13

Come funziona PHP ‐ IV

DBMS(es: MySQL Server)

HTTP request

DB

WebServer

interpretePHP

HTTP response

nome = mariaeta = 18-25dida.php...

Ciao Maria!Ho inserito i tuoi dati...

...

<?php$nome=$_POST["nome"];$eta=$_POST["eta"];...//inserimento nel DB

?>

Come ti chiami?

Quanti anni hai?

da 18 a 25

maria

… invia

INSERT INTO utentiVALUES ($nome, $eta)

server-side

client-side

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 14

XAMPP = pacchetto multi‐piattaforma (X = qualunque S.O.) contenente Apache, MySQL/MariaDB, PHP e Perl[www.apachefriends.org]

PHP: strumenti, XAMPP ‐ I

Page 8: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

8

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 15

• Consiglio: installare direttamente sotto C:/(NON sotto C:/Programmi/)

• Durante l’installazione è possibile che vi chieda se volete installare i vari server come servizi (avvio automatico): a vostra scelta (consiglio: NO)

• Dal pannello di controllo potete avviare e fermare i vari server(per noi sono rilevanti Apache e MySql Server)

PHP: strumenti, XAMPP ‐ II

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 16

Note• La configurazione di default di XAMPP va bene in fase di 

sviluppo, ma non è abbastanza sicura in fase di produzione

• Potete modificare la configurazione modificando i seguenti file (fatelo con cautela!):

– Apache: C:\xampp\apache\conf\httpd.conf

– PHP: C:\xampp\php\php.ini

– MySQL Server: C:\xampp\mysql\bin\my.ini

– phpMyAdmin: C:\xampp\phpMyAdmin\config.inc.php

NB: sono file di testo: apriteli con Blocco Note o simili (non con Word!)

• Potete accedere allo strumento di amministrazione di Apache, cliccando su Admin (di fianco ad Apache), nel pannello di controllo…

PHP: strumenti, XAMPP ‐ III

Page 9: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

9

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 17

PHP: strumenti, XAMPP ‐ IV

potete verificare se l'interprete PHP funziona cliccando su PHPInfo

• dal browser collegandovi a http://localhost/ potete accedere alla dashboard di XAMPP

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 18

• document root di Apache = C:\xampp\htdocs\ (= cartella dove mettete le pagine php, html, le immagini, ecc...)NB: sotto la document root potete creare nuove cartelle, x es: C:\xampp\htdocs\corsoTecWeb

• Per visualizzare con il browser le risorse contenute nella document root, vi connettete a: http://localhost/ (o http://localhost/ corsoTecWeb)NB: il "mapping" tra http://localhost/ e document root (C:\xampp\htdocs\)può essere modificato assegnando un diverso valore alla variabile DocumentRoot, nel file di configurazione del Web Server (httpd.conf)

• La configurazione di default di XAMPP prevede che, connettendosi a http://localhost/, vengano automaticamente visualizzate le pagine index.html o index.phpNB: si possono aggiungere altre "home page di default" (es. home.php) nel file httpd.conf, x es:

<IfModule dir_module>DirectoryIndex index.php index.html home.php ...

</IfModule>

PHP: strumenti, XAMPP ‐ V

Page 10: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

10

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: strumenti, editor ‐ I

Due possibili editor per PHP e compagni:

Notepad++ [notepad-plus-plus.org]Notepad++ is a free (as in "free speech" and also as in "free beer") source code editor [...] that supports several languages. Running in the MS Windows environment, its use is governed by GPL License.Based on the powerful editing component Scintilla, Notepad++ is written in C++ and uses pure Win32 API and STL which ensures a higher execution speed and smaller program size. 

jEdit [www.jedit.org]jEdit is a mature programmer's text editor [...] it is released as free software with full source code, provided under the terms of the GPL. [...]  Written in Java, so it runs on Mac OS X, OS/2, Unix, VMS and Windows. 

19

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 20

PHP: strumenti, framework e IDE ‐ IV

Una nota... [rif. Zimuel, 2017]

Per creare e manutenere un'applicazione professionale con PHP, occorre badare a moltissimi aspetti (che NON possiamoaffrontare in questo corso), x es: – utilizzare un Framework! [vedremo solo un esempio…]

– gestire con molta attenzione la sicurezza– pianificare un testing accurato (rif. PHPUnit testing framework)

– attivare log & monitoring (rif. error_log(), monolog logging library)

– gestire le dipendenze da librerie esterne, soprattutto in fasedi manutenzione (rif. Composer tool for dependency management)

– pianificare con cura il deploy in produzione

[vedi: www.zimuel.it/slides/unito2017#/]

L'obiettivo di questo corso è quello di gettare le basi per poiessere in grado di affrontare anche questi aspetti :‐)

Page 11: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

11

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: script tag ‐ IScript Style:

<script language="php" runat="server" >script...

</script>

XML Style:<?phpscript...?>

Short style:<?script...

?>

NB:• PHP è case‐sensitive: pippo Pippo PIPPO pipPo

(ma NON i nomi delle classi, né quelli delle funzioni...!)• le istruzioni devono terminare con punto‐e‐virgola ;

SCONSIGLIATO!!!attivato nel file php.ini:  short_open_tag = On

CONSIGLIATO (negli esempi useremo XML Style)

21

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 22

PHP: HTTP response ‐ I

<?phpprint "Hello!";

?><?phpecho "Ciao!";

?>

print e echo scrivono nel body dell'oggetto HTTP response

NOTA: print e echo sono equivalenti: l'unica differenza è che echo funziona anche con più stringhe (separate da una virgola: echo "pippo", "pluto", ...)

NB: Non sono vere e proprie funzioni, per questo le parentesinon sono obbligatorie, ma possono essere usate: print ("Hello!"); echo("Ciao!");

Web Server browserHTTP request

HTTP response

Page 12: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

12

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• Installate XAMPP

• Provate XAMPP (Apache e l’interprete PHP) avviate Apache (e MySQL/MariaDB) create una pagina HTML (es. mypage.html) con dentro un 

semplice codice HTML e mettetela nella document root di Apache  aprite il un browser connettetevi al Web Server e chiedetegli quella pagina (URL): 

http://localhost/mypage.html create una pagina PHP (es. mypage.php) con dentro un semplice 

script PHP, per es: ): <?php echo 'Ciao mondo!'; ?> mettetela nella document root di Apache  aprite il un browser connettetevi al Web Server e chiedetegli quella pagina (URL): 

http://localhost/mypage.php

TRY YOURSELF!

23

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• PHP è un linguaggio "debolmente tipato"

• Tipi di base in PHP: int: interi; es: 3, ‐5 float: decimali (reali); es: 7.67 boolean: valori booleani; es: TRUE (1), FALSE (0) string: sequenze di caratteri; es: "pippo", 'CV_45ie' array: liste (con indice) object: oggetti [come in Java]; es: data = new Date(); NULL: "il Nulla" ;‐) [come in Java]

• è possibile convertire il tipo (type casting); es: (int) 2.71 2

• PHP converte automaticamente i tipi durante l'esecuzione (quando possibile)

• la funzione gettype restituisce il tipo (in forma di stringa); la funzione var_dump restituisce il tipo e il valore; es: gettype($pippo) floatvar_dump($pippo) float(2.71)

PHP: tipi ‐ I

24

Page 13: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

13

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• I nomi delle variabili sono preceduti da $: $pippo

• Gli assegnamenti si fanno con =, per es: $pippo = 5;Altri operatori di assegnamento: +=, -=, *=, /=, %=, **=, .=

• Le varibili (compreso il tipo) vengono dichiarate implicitamente al primo assegnamento: $pippo = 5; pippo è di tipo int

• Le regole di visibilità sono le solite, all'interno della pagina (indipendentemente dai blocchi PHP <?php ... ?>)

• $pippo = $pluto il valore di pluto viene copiato in pippo (e le due variabili sono indipendenti)

$pippo = &$pluto viene creato un nuovo puntatore a pluto se modifico il valore di pluto,  viene modificato anche il valore di pippo (pippo è una reference variable, praticamente un alias di pluto)

• Posso anche definire delle costanti, che poi funzionano come delle variabili globali (sempre accessibili):define('MY_CONST', "Hello");

PHP: variabili e assegnamenti ‐ I

25

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

Operatori aritmetici: +, -, *, /, % (modulo, resto), ** (esponente, es: 42 4**2)++, -- (NB: $i++ vs ++$i !!)

Concatenazione di stringhe: $p = "pippo"; "Buongiorno" . $p "Buongiorno pippo"

Manipolazione di stringhe:$s = "pippo e topolino";strlen($s) 16$s[0] p $s[5] (spazio bianco)

$s[15] o 

PHP ha moltissime funzioni predefinite per la manipolazionedi stringhe... dategli un'occhiata! [php.net/strings]

PHP: operatori aritmetici e stringhe ‐ I

26

Page 14: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

14

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

Interpreted string: per facilitar la vita al programmatore ed evitare l'uso pesante della concatenazione...

<?php

$nome = "Anna";

print " Ciao $nome " ;

print " Ciao $nomeGoy " ;

print ' Ciao $nome ' ;

?>

PHP: operatori aritmetici e stringhe ‐ II

dentro ai doppi apici (") lavariabile viene valutata!

Ciao Anna

Ciao AnnaGoy

Ciao $nome

27

dentro agli apici semplici (') lavariabile NON viene valutata!

le graffe servono per poter scrivere il valore della variabile attaccato ad un carattere (senza spazio)

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• scrivete una semplice pagina (file) PHP (es. prima.php) che assegna una stringa ad una variabile e poi la stampa sulla pagina– provate ad usare interpreted string

– provate ad manipolare le stringhe usando le funzioni predefinite in PHP: php.net/strings (es. strlen, strpos – to search for a char in a string – strtoupper/strtolower – to change case – str_replace, substr – to estract sub‐strings, str_split – to convert a string into an array, ...);NB usate print_r($myArray) per stampare l'array ;‐)

TRY YOURSELF!

28

Page 15: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

15

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

Commenti:// commento su una riga# commento su una riga/* commento su + righe

commento su + righe */

Operatori di confronto:

PHP: commenti e operatori di confronto ‐ I

29

> maggiore

>= maggiore o uguale

< minore

<= minore o uguale

= = uguale (numeri e stringhe)ignora i tipi (2 == "2"  T)

!= opp 

<>diverso (numeri e stringhe)ignora i tipi (2 != "2"  F)

= = = uguale (numeri e stringhe)tiene conto dei tipi (2 === "2"  F)

!= = diverso (numeri e stringhe)tiene conto dei tipi (2 != "2"  T)

<=> spaceship operator1 <=> 2  ‐11 <=> 1  02 <=> 1  1

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: operatori booleani ‐ I

Operatori booleani:

NB in PHP ogni valore (di qualunque tipo) può essere considerato un booleano; x es: if ($var) ... funziona anche se var è un intero, una stringa, un array, ecc. In particolare:

• falsey values (0, 0.0, "", "=", NULL, array con 0 elementi, undefined variables): vengono valutati FALSE

• truthy values (tutti gli altri): vengono valutati TRUE

&& = and = And(sia l’uno che l’altro)

| | = or = Or(o l’uno o l’altro; oppure entrambi)

! = not =Not(il contrario di)

A B A && B

T T T

T F F

F T F

F F F

A B A || B

T T T

T F T

F T T

F F F

A !A

T F

F T

30

Page 16: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

16

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: condizionali e cicli ‐ I

if (condizione1) {sequenza_di_azioni_1

}elseif (condizione2) {sequenza_di_azioni_2

}...else {

sequenza_di_azioni_n}

for (inizio; test; incremento) {sequenza_di_azioni

}

se la condizione1 è vera esegui la sequenza_di_azioni_1altrimenti se la condizione2 è vera esegui la sequenza_di_azioni_2…altrimenti esegui la sequenza_di_azioni_n

31

esegui la sequenza_di_azioni a partire da inizio, finché test è vero, avanzando ad ogni passo di quanto è indicato da incremento

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: condizionali e cicli ‐ II

while (condizione) {sequenza_di_azioni

}

do {sequenza_di_azioni

} while (condizione)

NB le strutture di controllo (condizionali e cicli) in PHP NONintroducono uno scope per le variabili!

finché la condizione è vera esegui la sequenza_di_azioni(quando la condizione è falsa, lasequenza_di_azioni non viene eseguita) 

32

esegui la sequenza_di_azionifinché la condizione è vera (quando la condizione è falsa, lasequenza_di_azioni viene comunque eseguita una volta)

Page 17: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

17

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: condizionali e cicli ‐ III

PHP ha anche una sintassi alternativa per le strutture di controllo (condizionali e cicli):

if (condizione1):sequenza_di_azioni_1

elseif (condizione2):sequenza_di_azioni_2

...else:sequenza_di_azioni_n

endif;

for (inizio; test; incremento):sequenza_di_azioni

endfor;

while (condizione):sequenza_di_azioni

endwhile;33

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: condizionali e cicli ‐ IV

34

PHP ha anche un operatore ternario (una sorta di condizionale compatto):

(expr1) ? (expr2) : (expr3);

Per es:$ris = ($count>0) ? "Length=".$count : "Empty!";

... e un coalesce operator (ancora più compattto):(expr1) ?? (expr2) ... ?? (expr3);

Per es:$ris = $count ?? "count undefined";

se expr1 è vera restituisci expr2, altrimenti restituisci  expr3

se expr1 è vera restituiscila, se expr2 è vera restituiscila, ... altrimenti restituisci  expr3

Page 18: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

18

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: condizionali e cicli ‐ V

switch(variable) {case val1:sequenza_di_azioni_1

break;case val2:sequenza_di_azioni_2

break;...default:

sequenza_di_azioni_dbreak;

}

Provate a usare lo switch con lo spaceship operator...

35

se la variablile ha valore val1, esegui la sequenza_di_azioni_1

se la variablile ha valore val2, esegui la sequenza_di_azioni_2…altrimenti esegui la sequenza_di_azioni_d

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: funzioni ‐ IDefinizione della funzione:

function calcolaPrezzo( $prezzo_intero, $sconto ) {$risultato = 0.0;$risultato = $prezzo_intero-($prezzo_intero*$sconto)/100;return $risultato;

}

Invocazione della funzione:<?php$prezzo_iniziale = 250.0;$tasso_sconto = 10.0;$ris = calcolaPrezzo( $prezzo_iniziale, $tasso_sconto );?><p>Prezzo scontato: <?php echo $ris; ?></p>

Prezzo scontato: 225

VEDI es‐funz.php

return statement: per definire il risultato della funzione 

parametri "formali"NB: in PHP non dichiaro esplicitamente il tipo

36

parametri "attuali" 

Page 19: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

19

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: funzioni ‐ IIE' anche possibile specificare parametri opzionali (a cui si assegna un valore che viene usato se non viene specificato alcun parametro attuale):

function calcolaPrezzo($prezzo_intero, $sconto = 0.0 ) {

$risultato = 0,0;

$risultato = $prezzo_intero-($prezzo_intero*$sconto)/100;

return $risultato;

}

Invocazione:

<?php

$prezzo_iniziale = 350.0;

$ris = calcolaPrezzo($prezzo_iniziale);

?>

<p>Prezzo scontato: <?php echo $ris ?></p>

Prezzo scontato: 350

VEDI es‐funz.php

parametro con valore di default(NB sempre x ultimi!)

37

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: funzioni ‐ III

In PHP 7 è stato introdotta la possibilità di dichiarare i tipi deiparametri e del valore di ritorno (rif. php.net/manual e Zimuel, 2017):

function esempio(string $a, int $b): bool {$ris = false;$ris = ($a == $b) ? true : false; return $ris;

}

Tipi disponibili: php.net/manual/en/language.types.php

Da PHP 7 è possibile abilitare lo strict mode:

• in strict mode è necessario dichiarare i tipi

• l'interprete effettua il type‐checking e in caso di mismatch, viene lanciata un'eccezione di tipo TypeError (tranne l'uso di un int al posto di un float, che va comunque bene!)

• per attivare strict mode: inserire all'inizio (NB assoluto!) del filedeclare(strict_types=1);

38

Page 20: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

20

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: funzioni ‐ IVIn PHP è possibile invocare una funzione usando una variabile...

$calcolo = "calcolaPrezzo";

$prezzo_iniziale = 350.0;

$ris = $calcolo($prezzo_iniziale);

In PHP 7 è stato introdotto il concetto di nullable (rif. Zimuel, 2017):

39

VEDI es‐funz.php

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: funzioni ‐ V

• normalmente, in PHP, i parametri sono passati per valore, ma è possibile passarli per riferimento (con &):function ingrandisci(&$num) {$num = $num*2; }

$x = 5;ingrandisci($x);print $x; 10 (avessi passato $num per valore 5)NB1 usate il passaggio per riferimento con molta parsimonia!!NB2 gli oggetti [che vedremo...] fanno eccezione (sono passati per riferimento)

• le variabili dichiarate in una funzione hanno visibilità localeNB in PHP i costrutti come if e cicli NON danno origine a scope per le variabili

• per accedere a una variabile globale da dentro una funzione: $nomeCompleto = "Eastwood"; #var globalefunction completaNome() {

global $nomeCompleto;$nome = "Clint"; #var locale$nomeCompleto = "$nome $nomeCompleto"print $nomeCompleto;

} Clint Eastwood NB fatelo con molta parsimonia!!

40

Page 21: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

21

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 41

PHP: expression block ‐ IAl posto di<?php

$x = "Everything"; ?><P>The answer to the ultimate question of Life, the Universe and <?php echo $x ?> is <?php echo 6*7 ?></P>

possiamo usare gli expression block, x es:<?php

$x = "Everything"; ?><P>The answer to the ultimate question of Life, the Universe and <?= $x ?> is <?= 6*7 ?></P>

Non dimenticate l'= nell'expression block!!

Controllate che sia abilitato in php.ini (short_open_tag setting)!

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• una lista è una sequenza ordinata di elementi

• a differenza degli insiemi, le liste possono contenere duplicati

• per rappresentare una lista in PHP possiamo usare un array(indexed array)

• l'indice del primo elemento è sempre 0

• quando inserisco un elemento, l'array... non "fa spazio"  se inserisco etaBeta all'indice 2, l'array risultante sarà:

• NB gli array sono oggetti, quindi vengono passati per riferimento!!

• NB possono contenere elementi di tipo diverso... :‐(

PHP: array ‐ I

pippo minnipluto pippo

0 1 2 3

contenuto

posizione (indice/key)

42

pippo etaBetapluto pippo

0 1 2 3

Page 22: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

22

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• Per creare un array (per inizializzare una variabile di tipo array):$lista = array();$lista = array("pippo", "pluto", "minni"); oppure$lista = ["pippo", "pluto", "minni"];

• Per scrivere/leggere un elemento in posizione i$lista[i] = "etaBeta";$elem = $lista[i];

• Per aggiugere un elemento in fondo all'array:array_push($lista, "etaBeta");$lista[] = "etaBeta";

• Per eliminare un elemento dall'array:unset($lista[i]);

• Per sapere quanti elementi ha un array:$lungh = count($lista);

• Per stampare il contenuto (tutti gli elementi) di un array:print_r($lista); Array ( [0] => pippo [1] => pluto [2] => minni ) 

• Per sapere se un array contiene un certo elemento:in_array("pippo", $lista);

PHP: array ‐ II

43

VEDI es‐array.php

NB gli elem. restanti mantengono i loro indici!

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

Cicli sugli array: for e foreach

foreach ( array as elem ) {

sequenza_di_azioni}

• Leggo gli elementi dell'array con un for:<UL><?php for ($i = 0; $i < $lungh; $i++) { ?>

<li><?= $personaggi[$i] ?></li><?php } ?></UL>

• Leggo gli elementi dell'array con un foreach:<UL><?php foreach ($personaggi as $pers) { ?>

<li><?= $pers ?></li><?php } ?></UL>

PHP: array ‐ III

44

VEDI es‐array.php

lista da scorrere nuova variabile che viene automaticamenteriempita via via con elementi successivi della lista

• pippo• pluto• minni

• pippo• pluto• minni

Page 23: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

23

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

PHP: array ‐ IV• Modifico gli elementi dell'array con un foreach e 

successivamente li ri‐leggo, sempre con un foreach :‐(<?php foreach ($personaggi as $pers) {

$pers = "hasta siempre ".$pers;} ?>

<UL><?php foreach ($personaggi as $pers){?>

<li><?= $pers ?></li><?php } ?></UL>

• Modifico gli elementi dell'array con un for e successivamente li ri‐leggo con un foreach :‐)<?php for ($i = 0; $i < $lungh; $i++) {

$personaggi[$i] = "hasta siempre ".$personaggi[$i];} ?>

<UL><?php foreach ($personaggi as $pers){?>

<li><?= $pers ?></li><?php } ?></UL>

45

VEDI es‐array.php

• pippo• pluto• minni

• hasta siempre pippo• hasta siempre pluto• hasta siempre minni

perché nella var $pers c'è una copia dell'elemento corrente!

perché gli array sono sempre passati per riferimento!

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

In PHP è possibile anche accedere agli elementi chiamandoli "per nome", anziché usare la posizione, creando un array associativo

• Per crearlo:$cliente = array("nome" => "anna","cognome " => "goy", ...);

• Per scrivere/leggere singoli elementi:$cliente["nome"] = "anna";$n = $cliente["nome"];

• Per aggiugere un elemento (una coppia):$cliente["tel"] = 123456;

• Per sapere se una chiave esiste:array_key_exists("nome",$cliente);

• Per eliminare un elemento :unset($cliente["tel"]);

NB le chiavi possono essere stringhe, interi, ...

PHP: array ‐ V

anna

goy

...

nome

cognome

...

chiavi valori

46

molto importanti in PHP!

VEDI es‐array.php

Page 24: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

24

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

Cicli sugli array associativi: for e foreach

foreach (array as key => val ) {sequenza_di_azioni

}• Leggo gli elementi dell'array con un foreach:

<UL><?php foreach ($cliente as $dato => $valore) { ?>

<li><?= $dato ?> = <?= $valore ?></li><?php } ?></UL>

PHP ha moltissime funzioni predefinite per la manipolazionedi array... dategli un'occhiata! [php.net/arrays]

NB potete costruire array multidimensionali (array di array di array...)$clienti=array("goy" => array("anna",123456,"[email protected]"),"gena" => array("cristina",987654,"[email protected]")

);

PHP: array ‐ VI

47

VEDI es‐array.php

• nome = anna• cognome= goy• ...

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati

• "giocate" un po' con es‐array.php...– x es. provate a complicare stampare cose diverse per personaggi diversi (es: se il personaggio è Paperone, scrivete"avaro", se Gastone scrivete "fortunato", ecc.)

– poi provate a non scriverlo solo sulla pagina, ma a modificare l'elemento nell'array(es: Paperone Paperone ‐ avaro)

TRY YOURSELF!

48

Page 25: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

25

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 49

PHP: HTTP response ‐ II

PHP & HTMLNelle pagine PHP è possibile intervallare linee di script e linee di codice HTML, per es: <?php

if ($_POST["risposta"]=="si") {?>

<P ALIGN="CENTER">Bravo!</P><?php

} else {?>

<P ALIGN="CENTER">Peccato!</P><?php

}?>

oppure utilizzare print/echo per scrivere il codice HTML: <?php

if ($_POST["risposta"]=="si") {print "<P ALIGN='CENTER'>Bravo!</P>";

} else {print "<P ALIGN='CENTER'>Peccato!</P>";

}?>

La conoscenza di HTML (e CSS) è un pre‐requisito!!

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 50

PHP: HTTP response ‐ III• La primamodalità (scrivere l'output HTML direttamente in 

HTML, fuori dal contesto dello script) è considerata migliore ed è fortemente consigliata!

La seconda (usare print x scrivere HTML nella response) è meno leggibile e induce facilmente in errore (soprattutto per via della difficoltosa gestione degli apici...) ed è pertanto sconsigliata

• Come abbiamo visto, è anche possibile utilizzare gli expression block per inserire un'espressione PHP in un blocco HTML, x es:

<?php $x = "Everything"; ?><P>The answer to the ultimate question of Life, the

Universe and <?= $x ?> is <?= 6*7 ?></P>

NB: anche all'interno di un tag HTML! x es:<H<?= $x ?>>Title, level <?= $x ?></H<?= $x ?>>

<H2>Title, level 2</H2>

Ribadiamo... Non dimenticate l'= nell'expression block e controllate che sia abilitato in php.ini (short_open_tag setting)!

Page 26: la componente server‐side - DiUniTogoy/materiale/1920/02_TecWeb1920_introPHP.pdf · –attivarelog & monitoring(rif. error_log(), monolog logging library) –gestirele dipendenzeda

aa 2019/2020

26

Goy ‐ a.a. 2019/2020 Tecnologie Web: approcci avanzati 51

PHP: HTTP response ‐ IVPiù in generale, però, "mischiare" il codice PHP e il codice HTML non è considerata una pratica "pulita", perché tende a mescolare la logica dell'applicazione con l'interfaccia utente

Torneremo su questi aspetti più avanti, quando parleremo dell'implementazione del modello MVC in PHP...

Un modo per separare la logica applicativa dall'interfaccia utente (eventualmente insieme al modello MVC) è utilizzate un template engine

• template engine = strumento che gestisce pagine HTML contenenti marcatori per l'assegnazione d valori generati da PHP

• un es. di template engine è Plates (platesphp.com), che consente di gestire i marcatori con variabili PHP (non è necessario imparare una nuova sintassi)