2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito

Pagina creata da Gianluca De Martino
 
CONTINUA A LEGGERE
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Tecnologie Web:
                       approcci avanzati
                            a.a. 2020/2021

                               2a
                                                               Anna Goy

Goy - a.a. 2020/2021       Tecnologie Web: approcci avanzati              1
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
la componente
                         server-side:
                        introduzione a
                             PHP

Goy - a.a. 2020/2021       Tecnologie Web: approcci avanzati   2
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Goy - a.a. 2020/2021   Tecnologie Web: approcci avanzati   3
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Goy - a.a. 2020/2021   Tecnologie Web: approcci avanzati   4
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Goy - a.a. 2020/2021   Tecnologie Web: approcci avanzati   5
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Goy - a.a. 2020/2021   Tecnologie Web: approcci avanzati   6
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Goy - a.a. 2020/2021   Tecnologie Web: approcci avanzati   7
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Note sparse su PHP - I
      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, utilizzando la Zend API (in C)
Goy - a.a. 2020/2021                         Tecnologie Web: approcci avanzati             8
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Note sparse su PHP - II
       • nella versione 7 il motore è stato completamente re-implementato,
         migliorandone significativamente le prestazioni

Goy - a.a. 2020/2021                Tecnologie Web: approcci avanzati        9
2a - Tecnologie Web: approcci avanzati a.a. 2020/2021 - Unito
Note sparse su PHP - III
      • esistono moltissimi framework di sviluppo (open source), x es: Zend
        Framework, Symfony, Laravel, Lumen, 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 è contenuto direttamente
        nella pagina web...

Goy - a.a. 2020/2021                       Tecnologie Web: approcci avanzati                 10
Come funziona PHP - I
            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:
     [h]  PHP: esempio  HTML: interpretato dal browser
     [p]
Come funziona PHP - II
     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

Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati                 12
Come funziona PHP - III
     • La pagina risultante, composta dall'HTML originario [h] + il risultato
       dell'esecuzione dello script, viene inviata al browser (nel body dell'HTTP
       response)
     • Tipicamente:
              sistema    web server        DBMS                       interprete script
             operativo                                                   server-side
                Linux     Apache      MySQL/MariaDB                         PHP
                L.          A.             M.                  P.
           Linux (www.linuxfoundation.org)
           Apache (www.apache.org)                            tutte tecnologie
           MySQL (www.mysql.com) o MariaDB (mariadb.org) Open Source
           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.
Goy - a.a. 2020/2021                    Tecnologie Web: approcci avanzati                 13
Come funziona PHP - IV
                                nome = maria                                                       client-side
                                eta = 18-25
                                dida.php                                     Come ti
                                ...                     HTTP                 chiami? maria
                                                        request              Quanti    da 18 a 25
                server-side                                                  anni hai?
                                      Web                                    …                invia
                                     Server
                                                                              Ciao Maria!
                                                       HTTP                   Ho inserito i tuoi dati...
                                                       response               ...
                                    interprete
                                       PHP

                                                                            INSERT INTO utenti
                  
Goy - a.a. 2020/2021                          Tecnologie Web: approcci avanzati                                  14
PHP: strumenti, XAMPP - I
      XAMPP = pacchetto multi-piattaforma (X = qualunque S.O.) contenente
      Apache, MySQL/MariaDB, PHP e Perl [www.apachefriends.org]

Goy - a.a. 2020/2021               Tecnologie Web: approcci avanzati        15
PHP: strumenti, XAMPP - II
      • 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)

Goy - a.a. 2020/2021                   Tecnologie Web: approcci avanzati                       16
PHP: strumenti, XAMPP - III
      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…

Goy - a.a. 2020/2021                 Tecnologie Web: approcci avanzati                17
PHP: strumenti, XAMPP - IV
      • dal browser collegandovi a http://localhost/ potete accedere alla dashboard di
        XAMPP

                                                           potete verificare se l'interprete PHP
                                                           funziona cliccando su PHPInfo
Goy - a.a. 2020/2021                 Tecnologie Web: approcci avanzati                             18
PHP: strumenti, XAMPP - V
     • 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.php
           NB: si possono aggiungere altre "home page di default" (es. home.php) nel file httpd.conf, x es:
               
                   DirectoryIndex index.php index.html home.php ...
               
Goy - a.a. 2020/2021                               Tecnologie Web: approcci avanzati                          19
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.

Goy - a.a. 2020/2021                                 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 possiamo affrontare in questo corso),
        per 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 fase di
           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 poi essere in grado
            di affrontare anche questi aspetti :-)
Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati                   21
PHP: script tag - I
       Script Style:
             
               script...
             
       XML Style:
             
       Short style:
                           attivato nel file php.ini: short_open_tag = On

       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 ;
Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati   22
PHP: HTTP response - I
                                              HTTP request
                         web server                                         browser
                                             HTTP response

      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 parentesi non sono obbligatorie,
      ma possono essere usate: print ("Hello!"); echo("Ciao!");

Goy - a.a. 2020/2021                    Tecnologie Web: approcci avanzati                     23
TRY YOURSELF!
       • 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: 
              − mettetela nella document root di Apache
              − aprite il un browser
              − connettetevi al Web Server e chiedetegli quella pagina (URL):
                http://localhost/mypage.php

Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati                     24
Tecnologie Web:
                       approcci avanzati
                            a.a. 2020/2021

                              2b
                                                               Anna Goy

Goy - a.a. 2020/2021       Tecnologie Web: approcci avanzati              25
PHP: tipi - I
         • 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) → float
                var_dump($pippo) → float(2.71)

Goy - a.a. 2020/2021                              Tecnologie Web: approcci avanzati      26
PHP: variabili e assegnamenti - I
       • 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 )
       •     $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");
Goy - a.a. 2020/2021                        Tecnologie Web: approcci avanzati                       27
PHP: operatori aritmetici e stringhe - I
        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 manipolazione
        di stringhe... dategli un'occhiata! [php.net/strings]

Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati   28
PHP: operatori aritmetici e stringhe - II
            Interpreted string: per facilitar la vita al programmatore ed evitare l'uso
            pesante della concatenazione...
TRY YOURSELF!
      • scrivete una semplice pagina (file) PHP (es. prima.php) che
        assegna una stringa ad una variabile e poi stampa la variabile sulla
        pagina
             – provate a usare interpreted string
             – provate a manipolare le stringhe usando le funzioni predefinite in PHP:
               (php.net/strings), per 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) → provate a usare print_r($myArray)
                                                                    per stampare l'array ;-)

Goy - a.a. 2020/2021                          Tecnologie Web: approcci avanzati                       30
PHP: commenti e operatori di confronto - I
      Commenti:
            // commento su una riga
            # commento su una riga
            /* commento su + righe
               commento su + righe */
      Operatori di confronto:                                                >      maggiore

                       ==     uguale (numeri e stringhe)                     >=     maggiore o uguale
                              ignora i tipi (2 == "2" → T)
                                                                             <      minore
                       != opp diverso (numeri e stringhe)
                            ignora i tipi (2 != "2" → F)
PHP: operatori booleani - I
      Operatori booleani:
               && = and = And                      A      B A && B                    A   B A || B   A !A
                       (sia l’uno che l’altro)
                                                   T      T    T                      T   T   T      T F
                       | | = or = Or
                       (o l’uno o l’altro;       → T      F    F                      T   F   T      F T
                       oppure entrambi)
                                                   F      T    F                      F   T   T
                       ! = not =Not
                       (il contrario di)           F      F    F                      F   F   F

      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
Goy - a.a. 2020/2021                              Tecnologie Web: approcci avanzati                         32
PHP: condizionali e cicli - I
            if (condizione1) {
              sequenza_di_azioni_1             se la condizione1 è vera esegui la
            }                                  sequenza_di_azioni_1
            elseif (condizione2) {             altrimenti
            }
              sequenza_di_azioni_2
                                               se la condizione2 è vera esegui la
            ...                                sequenza_di_azioni_2
            else {                             …
              sequenza_di_azioni_n             altrimenti esegui la sequenza_di_azioni_n
            }

             for (inizio; test; incremento) {
               sequenza_di_azioni
             }

           esegui la sequenza_di_azioni a partire da inizio, finché test è vero,
           avanzando ad ogni passo di quanto è indicato da incremento
Goy - a.a. 2020/2021                     Tecnologie Web: approcci avanzati                 33
PHP: condizionali e cicli - II
            while (condizione) {     finché la condizione è vera esegui la
              sequenza_di_azioni     sequenza_di_azioni (quando la condizione è
            }                        falsa, la sequenza_di_azioni non viene eseguita)

            do {                     esegui la sequenza_di_azioni finché la
              sequenza_di_azioni     condizione è vera (quando la condizione è
            } while (condizione)     falsa, la sequenza_di_azioni viene comunque
                                     eseguita una volta)

      NB le strutture di controllo (condizionali e cicli) in PHP NON introducono un
         scope per le variabili! Quindi dentro a un costrutto condizionale o dentro a
         un ciclo posso modificare una variabile esterna

Goy - a.a. 2020/2021                 Tecnologie Web: approcci avanzati                  34
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;
Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati           35
PHP: condizionali e cicli - IV
            PHP ha anche un operatore ternario (una sorta di condizionale compatto):
                       (expr1) ? (expr2) : (expr3);

             se expr1 è vera restituisci expr2, altrimenti restituisci expr3
            Per es:
                       $ris = ($count>0) ? "Length=".$count : "Empty!";

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

             se expr1 è vera restituiscila, se expr2 è vera restituiscila,
             ... altrimenti restituisci expr3
            Per es:
                       $ris = $count ?? "count undefined";

Goy - a.a. 2020/2021                       Tecnologie Web: approcci avanzati           36
PHP: condizionali e cicli - V
            switch(variable) {
              case val1:                         se la variablile ha valore val1,
                sequenza_di_azioni_1
              break;                             esegui la sequenza_di_azioni_1
              case val2:                         se la variablile ha valore val2,
                sequenza_di_azioni_2
              break;                             esegui la sequenza_di_azioni_2
              ...                                …
              default:                           altrimenti esegui
                 sequenza_di_azioni_d
              break;
                                                 la sequenza_di_azioni_d
            }

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

Goy - a.a. 2020/2021                 Tecnologie Web: approcci avanzati              37
VEDI es-funz.php
                                          PHP: funzioni - I
            Definizione della funzione:
            function calcolaPrezzo( $prezzo_intero, $sconto ) {
              $risultato = 0.0;
              $risultato = $prezzo_intero-($prezzo_intero*$sconto)/100;
              return $risultato;
            }                                  parametri "formali"
                 return statement: per definire                NB: in PHP non dichiaro
                 il risultato della funzione                   esplicitamente il tipo
            Invocazione della funzione:
            
            Prezzo scontato: 
            → Prezzo scontato: 225
Goy - a.a. 2020/2021                       Tecnologie Web: approcci avanzati                      38
VEDI es-funz.php
                                    PHP: funzioni - II
      E' 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;                 parametro con
      }                                    valore di default
      Invocazione:                                      (NB sempre x ultimi!)
      
      Prezzo scontato: 
      → Prezzo scontato: 350

Goy - a.a. 2020/2021                  Tecnologie Web: approcci avanzati                     39
VEDI es-funz.php
                                         PHP: funzioni - III
            In 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):

Goy - a.a. 2020/2021                       Tecnologie Web: approcci avanzati                    40
VEDI es-funz_types.php
                                    PHP: funzioni - IV
     In PHP 7 è stato introdotta la possibilità di dichiarare i tipi dei parametri e del
     valore di ritorno (rif. php.net/manual e Zimuel, 2017):
           function esempio1(string $a, int $b): bool {
             $ris = false;
             $ris = ($a == $b) ? true : false;
             return $ris;
           }
           esempio1("2", 2) → true

           function esempio2(array $a, int $b): bool {
             $ris = false;
             $ris = ($a == $b) ? true : false;
             return $ris;
           }
           esempio2(array(), 2) → false

Goy - a.a. 2020/2021                   Tecnologie Web: approcci avanzati                        41
PHP: funzioni - V
     Tipi disponibili: php.net/manual/en/language.types.php
     (booleans, integers, floating point numbers, strings, arrays, objects, etc.)

     Da PHP 7 è possibile abilitare lo strict mode:
     • in strict mode è obbligatorio 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 file
           declare(strict_types=1);

Goy - a.a. 2020/2021                     Tecnologie Web: approcci avanzati                   42
PHP: funzioni - VI
      • 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à locale
            NB 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 globale
            function completaNome() {
              global $nomeCompleto;
              $nome = "Clint"; #var locale
              $nomeCompleto = "$nome $nomeCompleto"
              print $nomeCompleto;
            } → Clint Eastwood      NB fatelo con molta                            parsimonia!!
Goy - a.a. 2020/2021                           Tecnologie Web: approcci avanzati                  43
PHP: expression block - I
            Al posto di
            
            The answer to the ultimate question of Life, the
            Universe and  is 

            possiamo usare gli expression block, x es:
            
            The answer to the ultimate question of Life, the
            Universe and  is 
            Non dimenticate l'= nell'expression block!!
            Controllate che sia abilitato in php.ini (short_open_tag setting)!

Goy - a.a. 2020/2021                        Tecnologie Web: approcci avanzati    44
PHP: array - I
      • una lista è una sequenza ordinata di elementi
                          contenuto     pippo           pluto         minni     pippo
               posizione (indice/key)      0               1                2     3
      • 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,       pippo pluto etaBeta pippo
        quindi vengono passati
                                          0        1    2       3
        per riferimento!!
      • NB possono contenere elementi di tipo diverso... :-(

Goy - a.a. 2020/2021                    Tecnologie Web: approcci avanzati               45
VEDI es-array.php
                                            PHP: array - II
            • 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: NB gli elementi restanti
                                                    mantengono i loro indici!
                 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);
Goy - a.a. 2020/2021                         Tecnologie Web: approcci avanzati                   46
VEDI es-array.php
                                      PHP: array - III
            Cicli sugli array: for e foreach
                  lista da scorrere nuova variabile a cui vengono assegnati via via gli
            foreach ( array as elem ) { elementi della lista (il primo, poi il secondo,
               sequenza_di_azioni
                                               ecc.)
            }
      • Leggo gli elementi dell'array con un for:
            
                                 • pippo
                                            • pluto
                                                                 • minni
            
      • Leggo gli elementi dell'array con un foreach:
            
                                  • pippo
                                                      • pluto
                                                                 • minni
            
Goy - a.a. 2020/2021                   Tecnologie Web: approcci avanzati                       47
VEDI es-array.php
                                   PHP: array - IV
   • Tento di modificare gli elementi dell'array con un foreach e successivamente li
     ri-leggo, sempre con un foreach :-(
                                                               • pippo   perché nella var $pers
                                                                     • pluto   c'è una copia
                                  • minni   dell'elemento corrente!
                
   • Modifico gli elementi dell'array con un for e successivamente li ri-leggo con un
     foreach :-)
                                                                                      array sono
                                             • hasta siempre pippo                       sempre
         • hasta siempre pluto                        passati per
                 
                                       • hasta siempre minni                       riferimento!
        
Goy - a.a. 2020/2021                 Tecnologie Web: approcci avanzati                                       48
VEDI es-array.php
                                          PHP: array - V
          In PHP è possibile anche accedere agli elementi chiamandoli "per
          nome", anziché usare la posizione, creando un array associativo
          • Per crearlo:
               $cliente = array(
                 "nome" => "anna",                                                molto
                 "cognome" => "goy", ...);                                     importanti
                                                                                 in PHP!
          • Per scrivere/leggere singoli elementi:
                       $cliente["nome"] = "anna";
                       $n = $cliente["nome"];
                                                                                    chiavi   valori
          • Per aggiugere un elemento (una coppia):
               $cliente["tel"] = 123456;
          • Per sapere se una chiave esiste:                                       nome    anna
                       array_key_exists("nome", $cliente);                         cognome goy
          • Per eliminare un elemento :                                            ...       ...
               unset($cliente["tel"]);
          NB le chiavi possono essere stringhe, interi, ...
Goy - a.a. 2020/2021                       Tecnologie Web: approcci avanzati                                    49
VEDI es-array.php
                                        PHP: array - VI
         Cicli sugli array associativi: for e foreach
              foreach (array as key => val ) {
                sequenza_di_azioni
              }
         • Leggo gli elementi dell'array con un foreach:
              
                             • nome = anna
                 =                         • cognome= goy
                                                                    • ...
              
         PHP ha moltissime funzioni predefinite per la manipolazione
         di array... dategli un'occhiata! [php.net/arrays]
         NB potete costruire array multidimensionali (array di array di array...)
           $clienti = array(
              "goy" => array("anna", 123456, "goy@mail.it"),
              "gena" => array("cristina", 987654, "gen@mail.it")
           );
Goy - a.a. 2020/2021                      Tecnologie Web: approcci avanzati                              50
PHP: HTTP response - II
          PHP & HTML
            Nelle pagine PHP è possibile
            intervallare linee di script e linee di codice HTML, per es:
                   
                        Bravo!
                   
                        Peccato!
                   
               oppure utilizzare print/echo per scrivere il codice HTML:
PHP: HTTP response - III
      • La prima modalità (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:
                
                The answer to the ultimate question of Life, the
                  Universe and  is 

            NB: anche all'interno di un tag HTML! x es:
PHP: HTTP response - IV
            Più 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)

Goy - a.a. 2020/2021                   Tecnologie Web: approcci avanzati              53
TRY YOURSELF!

      • analizzate bene es-array.php e provate a dare una risposta il più
        completa possibile alla domanda finale (Qual è la morale della
        favola?)
      • "giocate" un po' con es-array.php...
             – x es. provate a complicare un po' le cose, stampando 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
               (per es. il nome stesso) nell'array
               (es: Paperone → Paperone - avaro)

Goy - a.a. 2020/2021                     Tecnologie Web: approcci avanzati                  54
Puoi anche leggere