Server side: la componente - PHP - Unito

Pagina creata da Gabriele Melis
 
CONTINUA A LEGGERE
Server side: la componente - PHP - Unito
aa 2019/2020

              la componente
                server‐side:
                       introduzione a
                            PHP

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

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

                                                                            1
Server side: la componente - PHP - Unito
aa 2019/2020

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

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

                                                                         2
Server side: la componente - PHP - Unito
aa 2019/2020

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

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

                                                                         3
Server side: la componente - PHP - Unito
aa 2019/2020

                       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 con funzionalità
  specifiche), utilizzando la Zen API (in C)
Goy ‐ a.a. 2019/2020         Tecnologie Web: approcci avanzati               7

                       Note sparse su PHP ‐ II
• nella versione 7 il motore è stato completamente re‐
  implementato, migliornadone significativamente le prestazioni

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

                                                                                             4
Server side: la componente - PHP - Unito
aa 2019/2020

                        Note sparse su PHP ‐ III
• 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 è contenuto
  direttamente nella pagina web...

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

                        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]
Server side: la componente - PHP - Unito
aa 2019/2020

                        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. 2019/2020          Tecnologie Web: approcci avanzati                       11

                       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
              L.        Apache
                          A.            MySQL/MariaDB
                                            M.                          PHP
                                                                         P.
     Linux (www.linuxfoundation.org)                    tutte
     Apache (www.apache.org)                            tecnologie
     MySQL (www.mysql.com) o MariaDB (mariadb.org) Open
     PHP (www.php.net)                                  Source
     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. 2019/2020          Tecnologie Web: approcci avanzati                       12

                                                                                                     6
Server side: la componente - PHP - Unito
aa 2019/2020

                        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. 2019/2020            Tecnologie Web: approcci avanzati                                      13

                       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. 2019/2020            Tecnologie Web: approcci avanzati                                      14

                                                                                                                      7
Server side: la componente - PHP - Unito
aa 2019/2020

                        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. 2019/2020          Tecnologie Web: approcci avanzati                  15

                        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. 2019/2020          Tecnologie Web: approcci avanzati                  16

                                                                                                 8
Server side: la componente - PHP - Unito
aa 2019/2020

                       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. 2019/2020          Tecnologie Web: approcci avanzati             17

                       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. 2019/2020          Tecnologie Web: approcci avanzati             18

                                                                                            9
Server side: la componente - PHP - Unito
aa 2019/2020

                        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. 2019/2020              Tecnologie Web: approcci avanzati    19

               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), 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 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. 2019/2020              Tecnologie Web: approcci avanzati    20

                                                                                        10
aa 2019/2020

                                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. 2019/2020               Tecnologie Web: approcci avanzati             21

                          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. 2019/2020               Tecnologie Web: approcci avanzati             22

                                                                                               11
aa 2019/2020

                           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. 2019/2020            Tecnologie Web: approcci avanzati      23

                                  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. 2019/2020            Tecnologie Web: approcci avanzati      24

                                                                                     12
aa 2019/2020

                       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. 2019/2020            Tecnologie Web: approcci avanzati       25

            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. 2019/2020            Tecnologie Web: approcci avanzati       26

                                                                                      13
aa 2019/2020

            PHP: operatori aritmetici e stringhe ‐ II
    Interpreted string: per facilitar la vita al programmatore ed
    evitare l'uso pesante della concatenazione...
aa 2019/2020

      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)
aa 2019/2020

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

                       PHP: condizionali e cicli ‐ II
        while (condizione) {                  finché la condizione è vera
          sequenza_di_azioni                  esegui la sequenza_di_azioni
        }                                     (quando la condizione è falsa, la
                                              sequenza_di_azioni non viene
                                              eseguita)

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

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

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

                                                                                                 16
aa 2019/2020

                       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. 2019/2020           Tecnologie Web: approcci avanzati            33

                       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ù compattto):
              (expr1) ?? (expr2) ... ?? (expr3);

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

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

                                                                                          17
aa 2019/2020

                       PHP: condizionali e cicli ‐ V
     switch(variable) {                                 se la variablile ha valore val1,
       case val1:                                       esegui la sequenza_di_azioni_1
         sequenza_di_azioni_1
       break;                                           se la variablile ha valore val2,
       case val2:                                       esegui la sequenza_di_azioni_2
         sequenza_di_azioni_2                           …
       break;                                           altrimenti esegui
       ...                                              la sequenza_di_azioni_d
       default:
          sequenza_di_azioni_d
       break;
     }

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

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

                                                                            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. 2019/2020          Tecnologie Web: approcci avanzati                       36

                                                                                                        18
aa 2019/2020

                                                                               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. 2019/2020          Tecnologie Web: approcci avanzati                           37

                            PHP: funzioni ‐ III
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          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 file
     declare(strict_types=1);
Goy ‐ a.a. 2019/2020          Tecnologie Web: approcci avanzati                           38

                                                                                                           19
aa 2019/2020

                                                                       VEDI es‐funz.php
                            PHP: funzioni ‐ IV
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. 2019/2020          Tecnologie Web: approcci avanzati                 39

                             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à 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. 2019/2020          Tecnologie Web: approcci avanzati                 40

                                                                                                   20
aa 2019/2020

                        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. 2019/2020               Tecnologie Web: approcci avanzati                   41

                                   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                 2   3
                                               1
  per riferimento!!
• NB possono contenere elementi di tipo diverso... :‐(
Goy ‐ a.a. 2019/2020               Tecnologie Web: approcci avanzati                   42

                                                                                                     21
aa 2019/2020

                                                                                   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";
                                                                     NB gli elem. restanti
 • Per eliminare un elemento dall'array:                            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. 2019/2020            Tecnologie Web: approcci avanzati                               43

                                                                                   VEDI es‐array.php
                                PHP: array ‐ III
   Cicli sugli array: for e foreach
                      nuova variabile che viene automaticamente
            lista da scorrere
   foreach ( array as elem ) {       riempita via via con elementi
                                     successivi della lista
        sequenza_di_azioni
   }
• 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. 2019/2020            Tecnologie Web: approcci avanzati                               44

                                                                                                                22
aa 2019/2020

                                                                            VEDI es‐array.php
                        PHP: array ‐ IV
• Modifico gli elementi dell'array con un foreach e
  successivamente li ri‐leggo, sempre con un foreach :‐(
     
                                             • pluto
      • minni
             
                         perché nella var $pers c'è una
                              copia dell'elemento corrente!
• Modifico gli elementi dell'array con un for e successivamente li
  ri‐leggo con un foreach :‐)
     
                                              • hasta siempre pippo
           • hasta siempre pluto
                             • hasta siempre minni
     
                                  perché gli array sono sempre
Goy ‐ a.a. 2019/2020
                                                        passati per riferimento!
                          Tecnologie Web: approcci avanzati                             45

                                                                            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. 2019/2020      Tecnologie Web: approcci avanzati                             46

                                                                                                         23
aa 2019/2020

                                                               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. 2019/2020       Tecnologie Web: approcci avanzati              47

                       TRY YOURSELF!
• "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)

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

                                                                                            24
aa 2019/2020

                        PHP: HTTP response ‐ II
PHP & HTML                            La conoscenza di HTML (e CSS)
                                      è un pre‐requisito!!
  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:
        
         The answer to the ultimate question of Life, the
           Universe and  is 
    NB: anche all'interno di un tag HTML! x es:
aa 2019/2020

                       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. 2019/2020        Tecnologie Web: approcci avanzati        51

                                                                                   26
Puoi anche leggere