SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
PHP5
terza parte - strutture evolute

        Gianfranco Fedele
       Analista programmatore

      gianfrasoft@gmail.com
    gianfrasoft.wordpress.com
 www.linkedin.com/in/gianfrasoft
PHP5: OOP Introduzione / 1

•   I concetti base della OOP: classe ed oggetto (o istanza): una classe è
    l’astrazione di un oggetto, mentre un oggetto è istanza di una classe.
•   La classe definisce un nuovo tipo di dato, caratterizzato da:
     –   Un insieme di variabili, detti attributi (o proprietà)
     –   da un insieme di funzioni che operano su di essi, detti metodi.
•   Caratteristiche della OOP:
     –   Ereditarietà – processo mirato alla creazione di gerarchie interne alle classi, grazie
         ad esso saranno maggiori le opportunità di riutilizzare porzioni del listato alla base
         di un applicativo.
     –   Polimorfismo – strettamente collegato alle dinamiche proprie dell'ereditarietà; con il
         polimorfismo è possibile originare comportamenti e risultati diversi impiegando i
         medesimi metodi a carico di oggetti differenti.
     –   Incapsulamento – possibilità di rendere "invisibili" in sede di scrittura del codice
         determinati dettagli ricollegati allo sviluppo di una classe specifica.




                                                                       gianfrasoft.wordpress.com - 2008
PHP5: OOP Introduzione / 2

•   In PHP la dichiarazione di una classe avviene tramite la parola chiave class,
    seguita dal nome della classe e dal corpo.

•   Il corpo della classe ne fornisce l’implementazione ed è costituito da
    dichiarazioni di proprietà e metodi.

•   Una proprietà è una variabile dichiarata all'interno della classe; la
    dichiarazione deve essere esplicita, attraverso la parola chiave var.

•   La dichiarazione di un metodo è del tutto analoga a quella di una funzione.
                                                 $this->variabile;
•   Accesso ad una proprietà o metodo
                                                 $this->metodo(...);
    nella classe:

    e fuori dalla classe:       $oggetto->variabile;
                                $oggetto->metodo(...);




                                                                gianfrasoft.wordpress.com - 2008
PHP5: OOP Introduzione / 3

•     La parola chiave new ci consente di istanziare una classe, cioè creare un
      oggetto istanza di una classe.
•     Il costruttore di classe è il metodo che è richiamato automaticamente alla
      creazione di un'istanza della classe.
•     Se all'interno di una classe base non è presente un costruttore, in automatico
      viene invocato quello della classe padre..

    // Questa classe non ha un costruttore dichiarato
    class Persona {
       var $nome, $cognome, $eta; // Proprieta'
       // Metodi
       function presenta() {
          echo "Ciao, mi chiamo ";
          echo $this->nome . " " . $this->cognome;
          echo " ed ho " . $this->eta . " anni.";
       }
    }

    // Creazione di una istanza della classe Persona
    $tizio = new Persona();

    // Invoca il metodo sull’oggetto Persona
    $tizio->presenta();
                                                                 gianfrasoft.wordpress.com - 2008
PHP5: OOP Costruttori e distruttori

•     Nell’ambito di ciascuna classe è possibile dichiarare un costruttore ed un
      distruttore:
       – Il costruttore è il metodo __construct() e viene richiamato ogniqualvolta viene
         istanziato un oggetto della classe stessa.
       – Il distruttore è il metodo __destruct() e viene richiamato ogniqualvolta viene
         eliminato un oggetto della classe stessa.
•     Per compatibilità verso PHP4 viene lasciata possibilità di dichiarare il
      costruttore col nome della classe stessa ma, se presente, quello nuovo avrà la
      precedenza.
    class ClasseDiProva
    {
       function __construct() {
          echo "* sono nel costruttore.<br />";
       }                                                       * Sono nel costruttore.
       function __destruct() {                                 * Sono in Funzione.
          echo "* Sono nel distruttore.<br />";                * Sono nel distruttore.
       }
       function Funzione() {
          echo "* Sono in Funzione.";
       }
    }
    $a = new ClasseDiProva;
    $a->Funzione();
                                                                        gianfrasoft.wordpress.com - 2008
PHP5: OOP Ereditarietà

•     In PHP è consentito creare classi che estendono le funzioni di un’altra classe.
      Queste si diranno classi derivate.
•     Non è consentita in PHP l’ereditarietà multipla.
•     Le classi si estendono mediante la parola chiave extends.

    // Definizione della classe Animale              // Definizione della classe Mammifero
    class Animale {                                  class Mammifero extends Animale {
      private $specie;                                 private $corna;

      // Costruttore                                   public function __construct($specie){
      public function __construct($specie){              $this->setSpecie($specie);
        $this->specie = $specie;                       }
      }
                                                       public function haCorna(){
      // Ritorna la specie                               return $this->corna;
      public function getSpecie(){                     }
        return $this->specie;
      }                                                public function setCorna($corna){
                                                         $this->corna = $corna;
      // Imposta la specie                             }
      public function setSpecie($specie){            }
        $this->specie = $specie;
      }
    }                                // Creo il leone come Mammifero
                                     $mammifero = new Mammifero("leone");
                                     $mammifero->setCorna(false);
                                     // Cambio da leone a cervo
                                     $mammifero->setSpecie("cervo"); // setSpecie() ereditato
                                     // Il cervo ha le corna
                                     $mammifero->setCorna(true);
                                                                                    gianfrasoft.wordpress.com - 2008
PHP5: OOP Polimorfismo

•     E’ consentito, all’interno di una classe derivata, riferirsi alle funzioni ed alle
      variabili della classe base. Infatti, mediante l’operatore “::” è possibile, in
      generale, invocare metodi di classi non istanziate.
•     Le funzioni richiamate della classe non possono, però, accedere alle variabili
      dell'oggetto ($this) ma possono comunque accedere alle variabili locali e
      globali.
    class ClasseA {
       function stampa_frase()
       {
          echo "Questa &egrave; la ClasseA<br>";
       }
    }
    class ClasseB extends ClasseA {
       function stampa_frase()
                                                              Questa è la ClasseA
       {
          echo "Questa &egrave; la ClasseB<br>n";            Questa è la ClasseB
          ClasseA::stampa_frase();                            Questa è la ClasseA
       }
    }
    ClasseA::stampa_frase();
    $b = new ClasseB;
    $b->stampa_frase();

                                                                    gianfrasoft.wordpress.com - 2008
PHP5: OOP Incapsulamento

•     I metodi e gli attributi possono essere dichiarati, nell’ambito delle classi, come:
       –    pubblici (parola chiave public) accessibili dall’esterno di un oggetto;
       –    privati (parola chiave private) non accessibili che dall’interno della classe;
       –    protetti (parola chiave protected) possono essere richiamati solo dall’interno
           della classe stessa oppure da una sua derivata, ma non direttamente dallo script.

    class prova
    {
       private $variabile;

      function get_variabile() {
         return $this->variabile;
      }
      protected function set_default() {
         $this->variabile = 5;
      }
      function __construct() {
         $this->set_default();
      }
    }
    $oggetto = new prova;
    echo "$variabile vale ".$oggetto->get_variabile();
    echo "n";
    $oggetto->variabile = 6; // Errore di protezione
                                                                        gianfrasoft.wordpress.com - 2008
PHP5: OOP direttiva final

•       In una classe derivata è possibile impedire la ridefinizione di determinati
        metodi e o la derivazione da determinate classi, usando la direttiva final.


    class ClasseBase
    {
        public $attributo;


        public final function metodo() {
            echo "Sono un metodo finale.";
        }
    }


    class SottoClasse extends ClasseBase
    {
        public function metodo() { // Genera un errore fatale
            echo "Sono un metodo derivato male.";
        }
    }


                                                                    gianfrasoft.wordpress.com - 2008
PHP5: OOP clonazione / 1

•   Assegnare ad una variabile l’stanza di un oggetto significa caricarne il
    riferimento all’istanza: da ciò deriva che tutte le copie della stessa variabile
    conterranno il riferimento allo stesso oggetto.
•   Per duplicare un oggetto è sufficiente mettere la parola chiave clone dopo
    l'operatore di assegnazione "=“.
    class Classe {
        public $valore;


        public function Classe($v) {
            $this->valore = $v;
        }
    }
    $istanza1 = new Classe(5);
    $istanza2 = $istanza1; // Assegnazione per riferimento
    $istanza3 = clone $istanza1; // Clonazione oggetto
    $istanza2->valore = 7; // Modifica anche $istanza1
    $istanza3->valore = 13;
    echo $istanza1->valore; // Non stampa 5 ma 7
    echo $istanza2->valore; // Stampa 7
    echo $istanza3->valore; // Stampa 13                          gianfrasoft.wordpress.com - 2008
PHP5: OOP clonazione / 2

•   Volendo è possibile controllare il processo di clonazione. Per farlo PHP ci
    consente di definire all'interno delle nostre classi il metodo __clone().

    class Classe {
        public $valore;


        public function Classe($v) {
            $this->valore = $v;
        }


        public function __clone()
        {
            $this->valore = "Sono stato clonato!";
        }
    }
    $istanza1 = new Classe(5);
    $istanza2 = clone $istanza1; // Clonazione oggetto


    echo $istanza1->valore; // Stampa 5
    echo $istanza2->valore; // Stampa “Sono stato clonato!”
                                                               gianfrasoft.wordpress.com - 2008
PHP5: Eccezioni

•   In PHP5 vengono definiti i blocchi nell’ambito dei quali è possibile catturare le
    eccezioni. Le parole chiave da utilizzare sono throw, try e catch.
•   Le eccezioni vengono gestite tramite una classe chiamata exception che
    fornisce di default 3 funzioni:
     – getmessage(): restituisce il parametro passato al momento della throw.
     – getfile(): restituisce il file che ha generato l'eccezione, utile nel caso della
        presenza di include().
     – getline(): restituisce la linea in cui presente l'invocazione della eccezione
        catturata.
•   Le eccezioni vengono gestite mediante la classe Exception. La classe
    Exception è altresì estendibile al fine di costruire nuove eccezioni
    personalizzate. Nel costruttore try {
                                          $a = -1;
    della nuova eccezione si              throw new Exception("$a &egrave; negativo<br>")
    dovrà richiamare il costruttore } echo "Dopo la throw<br>";
    della classe exception.           catch (Exception $e) {
                                            echo "Eccezione:".$e->getMessage()."<br>";
                                         }
                                         echo "fine";
                                                                       gianfrasoft.wordpress.com - 2008
PHP5: MySql / 1

•   In PHP sono presenti numerose funzioni per la connessione alle basi dati
    MySql. La lista completa è disponibile su:
    http://it2.php.net/manual/it/ref.mysql.php
•   Di seguito un esempio di query:
     $connessione = mysql_connect("localhost", "root", "")
          or die("Connessione non riuscita: ".mysql_error());

     mysql_selectdb("nome_db");

     if (mysql_connect_errno())
     {
         echo("Errore durante la connessione al server MySQL");
         exit();
     }
     else echo("Connessione effettuata con successo");

     $risultato = mysql_query("SELECT * FROM nomi", $connessione)
         or die(“Query non riuscita: ".mysql_error());

     while ($riga = mysql_fetch_assoc($risultato))
         echo("ID: " . $riga['id'] . " NOME: " . $riga['nome'] . "<br>");

     mysql_free_result($risultato);
     mysql_close($connessione);
                                                                    gianfrasoft.wordpress.com - 2008
PHP5: MySql / 2

•   Di seguito un esempio di update:



     $connessione = mysql_connect("localhost", "root", "", "rubrica");
     $modifica = “
         -- Questo è un commento SQL
         UPDATE operazioni
         SET
             campo = ?
     ";

     mysql_query($modifica, $valore) or die(mysql_error());
     mysql_close($connessione);




•   Notare che le stringhe che rimangono aperte sul rigo s’interrompono col
    carattere a capo senza restituire errori di tipo unterminated string.



                                                                   gianfrasoft.wordpress.com - 2008
PHP5: Mantenere lo stato

•   La mancanza di stato nel protocollo HTTP (per il quale si parla di protocollo
    stateless) impone di individuare soluzioni alternative per la conservazione dei
    valori delle variabili.
•   Le soluzioni individuate a tutt’oggi sono:
     –   moduli nascosti (input hidden)
     –   database
     –   cookie
     –   sessioni




                                                               gianfrasoft.wordpress.com - 2008
PHP5: Cookie / 1

•   I cookie sono un meccanismo generale per memorizzare e recuperare
    informazioni sul client della connessione.
•   Utilizzando i cookie e possibile mantenere le informazioni in modo persistente
    e quindi condividerle tra più script.
•   Un cookie gestisce coppie nome/valore; in PHP è una array a tutti gli effetti.
•   Un cookie ha una data di scadenza, decorsa la quale esso scompare
    automaticamente (per default, scompare alla chiusura del browser).
•   Ad ogni cookie sono associati anche un dominio ed un percorso (per default, il
    nome di dominio ed il percorso correnti).
•   Ogni cookie, infine, ha un attributo secure che, se impostato, ne consente il
    funzionamento solo su connessioni sicure (HTTPS).




                                                              gianfrasoft.wordpress.com - 2008
PHP5: Cookie / 2

 •   L’impostazione di un cookie avviene con la funzione setcookie(). Sul client
     viene impostata prima del tag <HTML> (a livello di intestazioni HTTP).
 •   Una volta impostato, un cookie è accessibile da PHP come una qualsiasi
     variabile globale.
 •   L’array associativo $_COOKIE, contiene tutte le coppie nome/valore relative
     ai cookie impostati.
 •   Il cookie assume il valore (viene impostato) solo dopo che il client ha inviato
     una riposta al server che lo ha definito.


$scadenza = time() + 60*60*24*10; // 10 gg
$percorso = "/";
$nome = "nome del cookie";                   while (list($nome,$valore) =
$valore = "valore del cookie";                  each($_COOKIE))
                                                   echo "<h2>Nome del cookie: $nome -
setcookie($nome, $valore,                    Valore: $valore<h2>";
    $scadenza, $percorso)
or die("non posso settare il cookie");



                                                                 gianfrasoft.wordpress.com - 2008
PHP5: Sessioni / 1

•   Il meccanismo delle sessioni è un espediente pensato per ovviare al problema
    della mancanza di stato nel protocollo HTTP.
•   Con le sessioni è possibile associare uno stato ad ogni client e mantenerlo
    nell'arco di più accessi.
•   Il mantenimento di una sessione richiede la collaborazione di client (il
    browser) e server. Tutte le informazioni della sessione sono sul server.
•   Il server codifica (mediante serializzazione) le informazioni di sessione su file
    e le ripristina alla successiva richiesta dello stesso client.
•   Il client deve fornire al server le informazioni per associare alla richiesta la
    sessione corrispondente.
•   Ciò è reso possibile da un identificativo di sessione (session ID) univoco
    generato all’avvio di una nuova sessione.




                                                                gianfrasoft.wordpress.com - 2008
PHP5: Sessioni / 2

•    La problematica principale riguardo le sessioni, è la propagazione del session ID. Le
     tecniche di propagazione sono tramite cookies e tramite URL.
•    Grazie ad un cookie, l'identificativo di sessione viene memorizzato sul client e rimane
     accessibile in PHP come variabile globale. Ciò non e sufficientemente affidabile: il
     visitatore, potrebbe aver configurato il proprio browser con i cookie disabilitati.
•    La propagazione tramite URL è del tutto identica al passaggio di parametri con il
     metodo GET: Si tratta di modificare i link alle varie pagine PHP in modo che
     contengano, nella parte di query string, il valore della costante SID. La costante SID è
     una costante che viene definita solo se il browser utente non supporta i cookies. Nel
     caso sia stato spedito il cookie, SID è una costante stringa vuota.
<? session_start(); ?>
<a href=“altro_script.php?<?= htmlspecialchars(SID) ?>&">Altro script</a>

<? /* htmlspecialchars serve a prevenire attacchi di tipo XSS (cross site scripting) mediante code injection */ ?>

•    Gli URL possono essere riscritti automaticamente abilitando la transparent session ID
     propagation agendo sulla direttiva session.use_trans_sid. Per modificare la direttiva in
     run time si può utilizzare uno dei comandi: ini_set('session.use_trans_sid', false);

                                                              // oppure
                                                              session.use_trans_sid = 0
                                                                                         gianfrasoft.wordpress.com - 2008
PHP5: Sessioni / 3

•    Le funzioni principali per la gestione delle sessioni sono:
      –    session_start(), crea una nuova sessione o la ripristina se esistente basata sull'id di sessione
          che viene passato attraverso una variabile GET o un cookie.
      –    session_register(), registra variabili come variabili di sessione;
      –    session_destroy(), distrugge una sessione, liberando le risorse.
•    L'interprete PHP verifica, in base ai cookie e ai parametri nella URL, se è stato fornito
     un identificativo di una sessione: in caso affermativo provvede a ripristinare la sessione
     corrispondente, diversamente ne avvia una nuova.
•    Affinché session_start() possa impostare il cookie contenente il SID, dovrà essere
     invocata prima che l’output sia inviato al browser.
•    A questo punto qualsiasi variabile può essere resa variabile di sessione, tramite la
     funzione session_register().
    session_start();
    if (!session_is_registered('accessi'))
        session_register('accessi');
    if (empty($_SESSION['accessi'])) {
        $_SESSION['accessi'] = 1;
    } else {
        $_SESSION['accessi']++;
    }
                                                                                  gianfrasoft.wordpress.com - 2008
PHP5: Sessioni / 4

•   Il session id va continuamente rigenerato per motivi di sicurezza (session
    fixation attack). Ciò può essere realizzato mediante il comando
    session_regenerate_id().




                                                               gianfrasoft.wordpress.com - 2008
PHP5
     terza parte - FINE

       Gianfranco Fedele
      Analista programmatore

     gianfrasoft@gmail.com
   gianfrasoft.wordpress.com
www.linkedin.com/in/gianfrasoft

Weitere ähnliche Inhalte

Andere mochten auch

Colors in language
Colors in languageColors in language
Colors in languageAtheer23
 
механизированные патроны 1
механизированные патроны 1механизированные патроны 1
механизированные патроны 1Vladislav_Stovbur
 
Slides(1) june entre
Slides(1) june entreSlides(1) june entre
Slides(1) june entreEntreMT2012
 
PELICULAS DE JASON STATHAM
PELICULAS DE JASON STATHAMPELICULAS DE JASON STATHAM
PELICULAS DE JASON STATHAMloretiti2902
 
ใบงานสำรวจตนเอง M6
ใบงานสำรวจตนเอง M6ใบงานสำรวจตนเอง M6
ใบงานสำรวจตนเอง M6Bliss_09
 
Thriller Pitch for AS Media Studies
Thriller Pitch for AS Media StudiesThriller Pitch for AS Media Studies
Thriller Pitch for AS Media StudiesTomAllawayMedia
 
2014 Award of Excellence in Opertations - AT
2014 Award of Excellence in Opertations - AT2014 Award of Excellence in Opertations - AT
2014 Award of Excellence in Opertations - ATDario Gnoato
 
20150116株式会社火燵研修ver.1.9.8
20150116株式会社火燵研修ver.1.9.820150116株式会社火燵研修ver.1.9.8
20150116株式会社火燵研修ver.1.9.8hoshinakamata1
 

Andere mochten auch (12)

Colors in language
Colors in languageColors in language
Colors in language
 
механизированные патроны 1
механизированные патроны 1механизированные патроны 1
механизированные патроны 1
 
Slides(1) june entre
Slides(1) june entreSlides(1) june entre
Slides(1) june entre
 
PELICULAS DE JASON STATHAM
PELICULAS DE JASON STATHAMPELICULAS DE JASON STATHAM
PELICULAS DE JASON STATHAM
 
ใบงานสำรวจตนเอง M6
ใบงานสำรวจตนเอง M6ใบงานสำรวจตนเอง M6
ใบงานสำรวจตนเอง M6
 
Juku naljad!
Juku naljad!Juku naljad!
Juku naljad!
 
Phys LO
Phys LOPhys LO
Phys LO
 
Thriller Pitch for AS Media Studies
Thriller Pitch for AS Media StudiesThriller Pitch for AS Media Studies
Thriller Pitch for AS Media Studies
 
2014 Award of Excellence in Opertations - AT
2014 Award of Excellence in Opertations - AT2014 Award of Excellence in Opertations - AT
2014 Award of Excellence in Opertations - AT
 
20150116株式会社火燵研修ver.1.9.8
20150116株式会社火燵研修ver.1.9.820150116株式会社火燵研修ver.1.9.8
20150116株式会社火燵研修ver.1.9.8
 
Sud osbb shevchenko4 a
Sud osbb shevchenko4 aSud osbb shevchenko4 a
Sud osbb shevchenko4 a
 
Furqan_Saqi (2)
Furqan_Saqi (2)Furqan_Saqi (2)
Furqan_Saqi (2)
 

Ähnlich wie Gianfrasoft Corso Di Php Parte 3

Ähnlich wie Gianfrasoft Corso Di Php Parte 3 (9)

Java 01
Java 01Java 01
Java 01
 
Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3Funzioni anonime in PHP 5.3
Funzioni anonime in PHP 5.3
 
Py t3 python-oggetti
Py t3 python-oggettiPy t3 python-oggetti
Py t3 python-oggetti
 
Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
Come Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagineCome Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagine
 
Java5
Java5Java5
Java5
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 
Corso Java
Corso JavaCorso Java
Corso Java
 

Kürzlich hochgeladen

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIinfogdgmi
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 

Kürzlich hochgeladen (9)

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AI
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 

Gianfrasoft Corso Di Php Parte 3

  • 1. PHP5 terza parte - strutture evolute Gianfranco Fedele Analista programmatore gianfrasoft@gmail.com gianfrasoft.wordpress.com www.linkedin.com/in/gianfrasoft
  • 2. PHP5: OOP Introduzione / 1 • I concetti base della OOP: classe ed oggetto (o istanza): una classe è l’astrazione di un oggetto, mentre un oggetto è istanza di una classe. • La classe definisce un nuovo tipo di dato, caratterizzato da: – Un insieme di variabili, detti attributi (o proprietà) – da un insieme di funzioni che operano su di essi, detti metodi. • Caratteristiche della OOP: – Ereditarietà – processo mirato alla creazione di gerarchie interne alle classi, grazie ad esso saranno maggiori le opportunità di riutilizzare porzioni del listato alla base di un applicativo. – Polimorfismo – strettamente collegato alle dinamiche proprie dell'ereditarietà; con il polimorfismo è possibile originare comportamenti e risultati diversi impiegando i medesimi metodi a carico di oggetti differenti. – Incapsulamento – possibilità di rendere "invisibili" in sede di scrittura del codice determinati dettagli ricollegati allo sviluppo di una classe specifica. gianfrasoft.wordpress.com - 2008
  • 3. PHP5: OOP Introduzione / 2 • In PHP la dichiarazione di una classe avviene tramite la parola chiave class, seguita dal nome della classe e dal corpo. • Il corpo della classe ne fornisce l’implementazione ed è costituito da dichiarazioni di proprietà e metodi. • Una proprietà è una variabile dichiarata all'interno della classe; la dichiarazione deve essere esplicita, attraverso la parola chiave var. • La dichiarazione di un metodo è del tutto analoga a quella di una funzione. $this->variabile; • Accesso ad una proprietà o metodo $this->metodo(...); nella classe: e fuori dalla classe: $oggetto->variabile; $oggetto->metodo(...); gianfrasoft.wordpress.com - 2008
  • 4. PHP5: OOP Introduzione / 3 • La parola chiave new ci consente di istanziare una classe, cioè creare un oggetto istanza di una classe. • Il costruttore di classe è il metodo che è richiamato automaticamente alla creazione di un'istanza della classe. • Se all'interno di una classe base non è presente un costruttore, in automatico viene invocato quello della classe padre.. // Questa classe non ha un costruttore dichiarato class Persona { var $nome, $cognome, $eta; // Proprieta' // Metodi function presenta() { echo "Ciao, mi chiamo "; echo $this->nome . " " . $this->cognome; echo " ed ho " . $this->eta . " anni."; } } // Creazione di una istanza della classe Persona $tizio = new Persona(); // Invoca il metodo sull’oggetto Persona $tizio->presenta(); gianfrasoft.wordpress.com - 2008
  • 5. PHP5: OOP Costruttori e distruttori • Nell’ambito di ciascuna classe è possibile dichiarare un costruttore ed un distruttore: – Il costruttore è il metodo __construct() e viene richiamato ogniqualvolta viene istanziato un oggetto della classe stessa. – Il distruttore è il metodo __destruct() e viene richiamato ogniqualvolta viene eliminato un oggetto della classe stessa. • Per compatibilità verso PHP4 viene lasciata possibilità di dichiarare il costruttore col nome della classe stessa ma, se presente, quello nuovo avrà la precedenza. class ClasseDiProva { function __construct() { echo "* sono nel costruttore.<br />"; } * Sono nel costruttore. function __destruct() { * Sono in Funzione. echo "* Sono nel distruttore.<br />"; * Sono nel distruttore. } function Funzione() { echo "* Sono in Funzione."; } } $a = new ClasseDiProva; $a->Funzione(); gianfrasoft.wordpress.com - 2008
  • 6. PHP5: OOP Ereditarietà • In PHP è consentito creare classi che estendono le funzioni di un’altra classe. Queste si diranno classi derivate. • Non è consentita in PHP l’ereditarietà multipla. • Le classi si estendono mediante la parola chiave extends. // Definizione della classe Animale // Definizione della classe Mammifero class Animale { class Mammifero extends Animale { private $specie; private $corna; // Costruttore public function __construct($specie){ public function __construct($specie){ $this->setSpecie($specie); $this->specie = $specie; } } public function haCorna(){ // Ritorna la specie return $this->corna; public function getSpecie(){ } return $this->specie; } public function setCorna($corna){ $this->corna = $corna; // Imposta la specie } public function setSpecie($specie){ } $this->specie = $specie; } } // Creo il leone come Mammifero $mammifero = new Mammifero("leone"); $mammifero->setCorna(false); // Cambio da leone a cervo $mammifero->setSpecie("cervo"); // setSpecie() ereditato // Il cervo ha le corna $mammifero->setCorna(true); gianfrasoft.wordpress.com - 2008
  • 7. PHP5: OOP Polimorfismo • E’ consentito, all’interno di una classe derivata, riferirsi alle funzioni ed alle variabili della classe base. Infatti, mediante l’operatore “::” è possibile, in generale, invocare metodi di classi non istanziate. • Le funzioni richiamate della classe non possono, però, accedere alle variabili dell'oggetto ($this) ma possono comunque accedere alle variabili locali e globali. class ClasseA { function stampa_frase() { echo "Questa &egrave; la ClasseA<br>"; } } class ClasseB extends ClasseA { function stampa_frase() Questa è la ClasseA { echo "Questa &egrave; la ClasseB<br>n"; Questa è la ClasseB ClasseA::stampa_frase(); Questa è la ClasseA } } ClasseA::stampa_frase(); $b = new ClasseB; $b->stampa_frase(); gianfrasoft.wordpress.com - 2008
  • 8. PHP5: OOP Incapsulamento • I metodi e gli attributi possono essere dichiarati, nell’ambito delle classi, come: – pubblici (parola chiave public) accessibili dall’esterno di un oggetto; – privati (parola chiave private) non accessibili che dall’interno della classe; – protetti (parola chiave protected) possono essere richiamati solo dall’interno della classe stessa oppure da una sua derivata, ma non direttamente dallo script. class prova { private $variabile; function get_variabile() { return $this->variabile; } protected function set_default() { $this->variabile = 5; } function __construct() { $this->set_default(); } } $oggetto = new prova; echo "$variabile vale ".$oggetto->get_variabile(); echo "n"; $oggetto->variabile = 6; // Errore di protezione gianfrasoft.wordpress.com - 2008
  • 9. PHP5: OOP direttiva final • In una classe derivata è possibile impedire la ridefinizione di determinati metodi e o la derivazione da determinate classi, usando la direttiva final. class ClasseBase { public $attributo; public final function metodo() { echo "Sono un metodo finale."; } } class SottoClasse extends ClasseBase { public function metodo() { // Genera un errore fatale echo "Sono un metodo derivato male."; } } gianfrasoft.wordpress.com - 2008
  • 10. PHP5: OOP clonazione / 1 • Assegnare ad una variabile l’stanza di un oggetto significa caricarne il riferimento all’istanza: da ciò deriva che tutte le copie della stessa variabile conterranno il riferimento allo stesso oggetto. • Per duplicare un oggetto è sufficiente mettere la parola chiave clone dopo l'operatore di assegnazione "=“. class Classe { public $valore; public function Classe($v) { $this->valore = $v; } } $istanza1 = new Classe(5); $istanza2 = $istanza1; // Assegnazione per riferimento $istanza3 = clone $istanza1; // Clonazione oggetto $istanza2->valore = 7; // Modifica anche $istanza1 $istanza3->valore = 13; echo $istanza1->valore; // Non stampa 5 ma 7 echo $istanza2->valore; // Stampa 7 echo $istanza3->valore; // Stampa 13 gianfrasoft.wordpress.com - 2008
  • 11. PHP5: OOP clonazione / 2 • Volendo è possibile controllare il processo di clonazione. Per farlo PHP ci consente di definire all'interno delle nostre classi il metodo __clone(). class Classe { public $valore; public function Classe($v) { $this->valore = $v; } public function __clone() { $this->valore = "Sono stato clonato!"; } } $istanza1 = new Classe(5); $istanza2 = clone $istanza1; // Clonazione oggetto echo $istanza1->valore; // Stampa 5 echo $istanza2->valore; // Stampa “Sono stato clonato!” gianfrasoft.wordpress.com - 2008
  • 12. PHP5: Eccezioni • In PHP5 vengono definiti i blocchi nell’ambito dei quali è possibile catturare le eccezioni. Le parole chiave da utilizzare sono throw, try e catch. • Le eccezioni vengono gestite tramite una classe chiamata exception che fornisce di default 3 funzioni: – getmessage(): restituisce il parametro passato al momento della throw. – getfile(): restituisce il file che ha generato l'eccezione, utile nel caso della presenza di include(). – getline(): restituisce la linea in cui presente l'invocazione della eccezione catturata. • Le eccezioni vengono gestite mediante la classe Exception. La classe Exception è altresì estendibile al fine di costruire nuove eccezioni personalizzate. Nel costruttore try { $a = -1; della nuova eccezione si throw new Exception("$a &egrave; negativo<br>") dovrà richiamare il costruttore } echo "Dopo la throw<br>"; della classe exception. catch (Exception $e) { echo "Eccezione:".$e->getMessage()."<br>"; } echo "fine"; gianfrasoft.wordpress.com - 2008
  • 13. PHP5: MySql / 1 • In PHP sono presenti numerose funzioni per la connessione alle basi dati MySql. La lista completa è disponibile su: http://it2.php.net/manual/it/ref.mysql.php • Di seguito un esempio di query: $connessione = mysql_connect("localhost", "root", "") or die("Connessione non riuscita: ".mysql_error()); mysql_selectdb("nome_db"); if (mysql_connect_errno()) { echo("Errore durante la connessione al server MySQL"); exit(); } else echo("Connessione effettuata con successo"); $risultato = mysql_query("SELECT * FROM nomi", $connessione) or die(“Query non riuscita: ".mysql_error()); while ($riga = mysql_fetch_assoc($risultato)) echo("ID: " . $riga['id'] . " NOME: " . $riga['nome'] . "<br>"); mysql_free_result($risultato); mysql_close($connessione); gianfrasoft.wordpress.com - 2008
  • 14. PHP5: MySql / 2 • Di seguito un esempio di update: $connessione = mysql_connect("localhost", "root", "", "rubrica"); $modifica = “ -- Questo è un commento SQL UPDATE operazioni SET campo = ? "; mysql_query($modifica, $valore) or die(mysql_error()); mysql_close($connessione); • Notare che le stringhe che rimangono aperte sul rigo s’interrompono col carattere a capo senza restituire errori di tipo unterminated string. gianfrasoft.wordpress.com - 2008
  • 15. PHP5: Mantenere lo stato • La mancanza di stato nel protocollo HTTP (per il quale si parla di protocollo stateless) impone di individuare soluzioni alternative per la conservazione dei valori delle variabili. • Le soluzioni individuate a tutt’oggi sono: – moduli nascosti (input hidden) – database – cookie – sessioni gianfrasoft.wordpress.com - 2008
  • 16. PHP5: Cookie / 1 • I cookie sono un meccanismo generale per memorizzare e recuperare informazioni sul client della connessione. • Utilizzando i cookie e possibile mantenere le informazioni in modo persistente e quindi condividerle tra più script. • Un cookie gestisce coppie nome/valore; in PHP è una array a tutti gli effetti. • Un cookie ha una data di scadenza, decorsa la quale esso scompare automaticamente (per default, scompare alla chiusura del browser). • Ad ogni cookie sono associati anche un dominio ed un percorso (per default, il nome di dominio ed il percorso correnti). • Ogni cookie, infine, ha un attributo secure che, se impostato, ne consente il funzionamento solo su connessioni sicure (HTTPS). gianfrasoft.wordpress.com - 2008
  • 17. PHP5: Cookie / 2 • L’impostazione di un cookie avviene con la funzione setcookie(). Sul client viene impostata prima del tag <HTML> (a livello di intestazioni HTTP). • Una volta impostato, un cookie è accessibile da PHP come una qualsiasi variabile globale. • L’array associativo $_COOKIE, contiene tutte le coppie nome/valore relative ai cookie impostati. • Il cookie assume il valore (viene impostato) solo dopo che il client ha inviato una riposta al server che lo ha definito. $scadenza = time() + 60*60*24*10; // 10 gg $percorso = "/"; $nome = "nome del cookie"; while (list($nome,$valore) = $valore = "valore del cookie"; each($_COOKIE)) echo "<h2>Nome del cookie: $nome - setcookie($nome, $valore, Valore: $valore<h2>"; $scadenza, $percorso) or die("non posso settare il cookie"); gianfrasoft.wordpress.com - 2008
  • 18. PHP5: Sessioni / 1 • Il meccanismo delle sessioni è un espediente pensato per ovviare al problema della mancanza di stato nel protocollo HTTP. • Con le sessioni è possibile associare uno stato ad ogni client e mantenerlo nell'arco di più accessi. • Il mantenimento di una sessione richiede la collaborazione di client (il browser) e server. Tutte le informazioni della sessione sono sul server. • Il server codifica (mediante serializzazione) le informazioni di sessione su file e le ripristina alla successiva richiesta dello stesso client. • Il client deve fornire al server le informazioni per associare alla richiesta la sessione corrispondente. • Ciò è reso possibile da un identificativo di sessione (session ID) univoco generato all’avvio di una nuova sessione. gianfrasoft.wordpress.com - 2008
  • 19. PHP5: Sessioni / 2 • La problematica principale riguardo le sessioni, è la propagazione del session ID. Le tecniche di propagazione sono tramite cookies e tramite URL. • Grazie ad un cookie, l'identificativo di sessione viene memorizzato sul client e rimane accessibile in PHP come variabile globale. Ciò non e sufficientemente affidabile: il visitatore, potrebbe aver configurato il proprio browser con i cookie disabilitati. • La propagazione tramite URL è del tutto identica al passaggio di parametri con il metodo GET: Si tratta di modificare i link alle varie pagine PHP in modo che contengano, nella parte di query string, il valore della costante SID. La costante SID è una costante che viene definita solo se il browser utente non supporta i cookies. Nel caso sia stato spedito il cookie, SID è una costante stringa vuota. <? session_start(); ?> <a href=“altro_script.php?<?= htmlspecialchars(SID) ?>&">Altro script</a> <? /* htmlspecialchars serve a prevenire attacchi di tipo XSS (cross site scripting) mediante code injection */ ?> • Gli URL possono essere riscritti automaticamente abilitando la transparent session ID propagation agendo sulla direttiva session.use_trans_sid. Per modificare la direttiva in run time si può utilizzare uno dei comandi: ini_set('session.use_trans_sid', false); // oppure session.use_trans_sid = 0 gianfrasoft.wordpress.com - 2008
  • 20. PHP5: Sessioni / 3 • Le funzioni principali per la gestione delle sessioni sono: – session_start(), crea una nuova sessione o la ripristina se esistente basata sull'id di sessione che viene passato attraverso una variabile GET o un cookie. – session_register(), registra variabili come variabili di sessione; – session_destroy(), distrugge una sessione, liberando le risorse. • L'interprete PHP verifica, in base ai cookie e ai parametri nella URL, se è stato fornito un identificativo di una sessione: in caso affermativo provvede a ripristinare la sessione corrispondente, diversamente ne avvia una nuova. • Affinché session_start() possa impostare il cookie contenente il SID, dovrà essere invocata prima che l’output sia inviato al browser. • A questo punto qualsiasi variabile può essere resa variabile di sessione, tramite la funzione session_register(). session_start(); if (!session_is_registered('accessi')) session_register('accessi'); if (empty($_SESSION['accessi'])) { $_SESSION['accessi'] = 1; } else { $_SESSION['accessi']++; } gianfrasoft.wordpress.com - 2008
  • 21. PHP5: Sessioni / 4 • Il session id va continuamente rigenerato per motivi di sicurezza (session fixation attack). Ciò può essere realizzato mediante il comando session_regenerate_id(). gianfrasoft.wordpress.com - 2008
  • 22. PHP5 terza parte - FINE Gianfranco Fedele Analista programmatore gianfrasoft@gmail.com gianfrasoft.wordpress.com www.linkedin.com/in/gianfrasoft