23. I namespace

Andrea Pastore 27/09/2020 0

Un namespace una collezione di nomi di entità, definite dal programmatore, omogeneamente usate in uno o più file sorgente. A partire da PHP 7 anche PHP supporta questo approccio, che ha lo scopo di evitare confusione ed equivoci nel caso siano necessarie molte entità con nomi simili, fornendo il modo di raggruppare i nomi per categorie.

Concettualmente un namespace è assimilabile alla struttura delle cartelle di un filesystem: dobbiamo dichiarare un’origine per il nostro namespace che corrisponde alla directory root, o al nome del disco su sistemi Windows, e possiamo inserire in maniera sequenziale una serie di suddivisioni che in questa similitudine rappresenterebbero le sottocartelle.

Vantaggi dei namespace

Il primo vantaggio è quello di organizzare il codice in modo da facilitare la manutenibilità, ad esempio tramite lo standard PSR-4;

non dobbiamo preoccuparci dei problemi relativi alle omonimie tra classi, ad esempio una classe con un nome molto comune come Connection non sarà più un problema.

 

Potrebbero interessarti anche...

Andrea Pastore 27/09/2020

20. Le interfacce ed ereditarietà

Vediamo ora altri due concetti fondamentali nella programmazione ad oggetti: le interfacce e l’ereditarietà. Le prime servono per standardizzare il codice, l’ereditarietà invece serve per ottimizzare il codice scritto ed evitare ripetizioni.

Interfacce

Le interfacce vengono utilizzate per definire un tipo di dato e una classe, che però non viene implementato. Vengono definite solo le firme dei metodi che poi saranno implementate in altre classi. Vediamo un esempio di interfaccia:

public interface Libro {

public void stampaLibro();

public void setTitolo(String titolo);

public String getTitolo();

public void setNumeroPagine(int numeroPagine);

public int getNumeroPagine();

}

Per usare una determinata interfaccia dopo il nome della classe dobbiamo usare la parola chiave implements seguita dal nome dell'interfaccia. Appena facciamo questo il nostro IDE ci segnalerà che i metodi dell'interfaccia non sono ancora implementati, clicchiamo su add unimplementated methods (potrebbe cambiare a seconda dell’ide usato) e il nostro IDE li aggiungerà per noi, dobbiamo solo completarli con il codice all'interno.

In sostanza le interfacce consentono di standardizzare il codice: due programmatori si accordano sui metodi e su come vengono chiamati, e poi ai fini dell'interoperabilità delle classi non è importante come viene implementato. Nel tempo le implementazioni possono cambiare, ma rispettandole interfacce non ci saranno problemi di incompatibilità

Ereditarietà

Ci sono casi in cui dobbiamo creare classi molto simili tra loro. Per questo molti linguaggi di programmazione consentono di usare il meccanismo dell’ereditarietà. Supponiamo di avere bisogno di queste due classi:

  • Utente
    id, nome, cognome, indirizzo, telefono
  • Fornitore
    id, nome, cognome, indirizzo, telefono, partita IVA

notiamo che Fornitore è quasi uguale alla classe Utente, quindi non ha senso riscriverla. Quando creiamo la classe Fornitore che estenderà la classe Utente.

Anatomia di una classe

Ogni classe è composta da tre tipi di elementi:

Variabili

le variabili di una classe si dichiarano come le variabili che abbiamo sempre visto, ovvero specificando il tipo di dato (int, double, String e così via) ma in più dobbiamo specificare il tipo di accesso, ovvero public, private, protected. Questo è necessario per utilizzare una caratteristica della programmazione ad oggetti, l’incapsulamento, che vedremo più avanti.

Metodi

I metodi rappresentano le operazioni che possono essere eseguite dagli oggetti di quella classe. Come le funzioni, i metodi possono avere parametri in input e possono essere usati per eseguire le operazioni più varie. Possono anche avere parametri preimpostati come visto nel capitolo delle funzioni.

Anche nei metodi usiamo un indicatore di accesso tra public, private, protected.

Costruttore

una casse di per se è solo un elenco di metodi e variabili, definisce il comportamento di un oggetto ma non viene eseguita direttamente, per utilizzarla dobbiamo creare un oggetto di quel tipo. Per questo ogni classe ha un metodo speciale chiamato costruttore, che serve a creare l’oggetto su cui noi possiamo poi usare i metodi definiti nella classe. Può prendere in input dei parametri con i quali inizializzerà le variabili di classe. Il costruttore si invoca con la parola chiave new seguita dal nome della classe e i parametri che abbiamo stabilito nel costruttore.

Cosa succede quando invochiamo un costruttore?

Quando invochiamo un costruttore di una classe viene creato un oggetto che ha al suo interno le variabili definite da quella classe, che ci mette a disposizione i metodi definiti nella classe. Per ogni classe possiamo creare tutti gli oggetti che vogliamo.

Metodi statici

PHP consente di creare metodi statici, che sono cui metodi il cui output sempre uniforme, che non dipende da variabili di classe. Quando creiamo un oggetto che è un’istanza di una classe normale PHP creerà un oggetto di quella classe su cui noi possiamo eseguire i metodi.  Se invece vogliamo invocare un metodo statico la sintassi è diversa: dobbiamo scrivere il nome della classe seguito dai 2 punti seguiti dal nome del metodo, ad esempio:

	NomeClasse::nomeMetodo();

I metodi statici devono essere preceduti dalla parola chiave static e possono essere utilizzati senza creare un costruttore. Dal momento che i metodi statici possono essere invocati in qualsiasi contesto non possiamo inserire al loro interno eventuali variabili di classe.

Esempio di metodo statico

Vediamo un esempio di metodo statico: immaginiamo di avere una classe esempio con un metodo statico che prende in input un link e un titolo e li stampa in un codice HTML.

class Esempio {

         static function visualizzazioneArticolo($linkContenuto,$titolo) {

            echo"<div class=\"articolo\">

                <h2 class=\"title\"><a href=\"$linkContenuto\">{$titolo}</a></h2>

            </div>\n";

        }

}

Per utilizzare questo metodo scriveremmo:

	Esempio::visualizzazioneArticolo($link,$titolo);

Nota: i metodi statici non possono usare variabili istanza, se proviamo ad accedere ad una proprietà non statica (ad esempio una variabile di classe) otterremo un errore, ad esempio il seguente codice:

class Esempio {
         static function visualizzazioneArticolo() {
            echo"<div class=\"articolo\">
                <h2 class=\"title\"><a href=\"$this->linkContenuto\">{$this->titolo}</a></h2>
            </div>\n";
        }
}

Genera un errore di questo tipo:

Fatal error: Using $this when not in object context in …

Questo perché noi abbiamo provato ad invocare una variabile istanza in un metodo statico, ma dato che quando si usa un metodo statico non è stato proprio creato un oggetto quella variabile non esiste.

Il paradigma MVC

La programmazione ad oggetti è utilizzata nel paradigma MVC (Model, View, Controller), che consente una separazione delle logiche. Vediamo i tre elementi nel dettaglio:

  • model
    sono le classi cosi come le abbiamo viste. Quando creiamo una classe infatti definiamo degli oggetti ma non li usiamo in quell’istante
  • view
    le viste rappresentano la parte del progetto che mostra i dati visivamente
  • controller
    sono i file che consentono di rendere permanenti le operazioni sugli oggetti: creazione di nuovi elementi, modifica di elementi esistenti, eliminazione di elementi e anche recupero dei dati di un elemento. I controller nascondono le logiche sottostanti alle altre classi: potremmo voler salvare i dati in un file oppure nel database, per le classi esterne viene chiamato lo stesso metodo. Facendo passare tutte le operazioni di salvataggio, modifica, caricamento per il controller avremo solo una classe che gestisce queste operazioni, che si traduce in un vantaggio per la manutenibilità del codice, in quanto per apportare modifiche alla gestione degli oggetti dovremmo modificare solo la classe relativa.
Leggi tutto

Andrea Pastore 26/09/2020

5. PHP e l’HTML

PHP è un linguaggio di scripting che lavora in simbiosi con l’HTML, tanto è vero che può essere utilizzato insieme ad esso. Se però scriviamo del codice HTML all’interno di un pezzo di codice PHP (ovvero tutto quello che scriviamo tra i tag <?php e ?>) otteniamo un errore. Ad esempio guardiamo questo semplice codice:

Vediamo che abbiamo inserito un codice HTML (che incomincia con il tag

e finisce con

), ma l’interprete PHP analizzando questo codice trova il simbolo “<” che per lui ha un significato diverso ed è scorretto nella posizione in cui sta, quindi segnala un errore di tipo Syntax error.

Per scrivere codice HTML in uno script PHP dobbiamo usare la funzione echo. Il codice HTML deve essere trattato come una normale stringa. Vediamo l’esempio qui sotto:

Leggi tutto

Andrea Pastore 27/09/2020

11. Gli array in PHP

Spesso quando programmiamo ci troviamo a memorizzare un gran numero di variabili, e sarebbe scomodo memorizzarle ognuna in una variabile.

Si pensi per esempio ai nomi di una classe di 20 bambini: creare una variabile per ognuno sarebbe scomodo. Esiste un sistema migliore messo a disposizione dalla maggior parte dei linguaggi di programmazione, compreso il PHP: gli array.

Un array è una variabile speciale in grado di contenere al suo interno più elementi, accessibili con un indice. Questo tipo di variabili prendono il nome di strutture dati. Ogni linguaggio ne ha diversi tipi di strutture dati, l'array è una delle più comuni nonché la prima che incontriamo nel nostro percorso formativo.

Gli array in PHP si possono dichiarare in due modi: con la funzione array() oppure scrivendo il loro contenuto all'interno di []. Vediamo un paio di esempi:         

	// uso array()

        $nomi  = array("Andrea","Luca","Antonio");

// uso il comando []

        $nomi2 = ["Pippo","Pluto","Paperino"];

Stampare gli elementi di un array

Per stampare un elemento specifico usiamo la funzione echo del negozio tra le parentesi quadre il numero dell'elemento da stampare (ricordiamo che si inizia a contare da 0).

	echo $nomi[0];  // mettendo come indice 0 accediamo alla prima posizione

Per stampare tutti gli elementi usiamo un ciclo for:

        for($i=0;$i<count($nomi);$i++) {

            echo $nomi[$i];

        }

Aggiungere elementi ad un array

Oltre ad inserire gli elementi nel momento della creazione possiamo aggiungere in qualsiasi momento altri elementi al nostro array. Per farlo possiamo usare la funzione array_push oppure scrivere il numero di elemento che vogliamo creare. Vediamo degli esempi, supponiamo di voler inserire il nome Giovanni nell’array dichiarato sopra:

	// uso la funzione array_push

array_push($nomi,”Giovanni”);

// dichiaro direttamente una nuova posizione nell’array

$nomi[3] = “Giovanni”;

Nota: nel primo caso l’elemento verrà aggiunto alla fine dell’array, nel secondo invece siamo noi a stabilire la posizione. Se quella posizione non è presente viene creata, altrimenti il valore precedente viene sovrascritto

Rimuovere gli elementi di un array

Per rimuovere un elemento dall’array possiamo usare la funzione unset, ad esempio:

	unset($nomi[i]);

Contare gli elementi in un array

Per sapere il numero di elementi di un array possiamo usare la funzione count(). Ad esempio se volessimo sapere la dimensione dell’array $nomi creato prima potremmo scrivere:

	$numeroElementi = count($nomi);

Gli array associativi

Gli array associativi sono array che hanno come indici delle parole al posto dei numeri. Sono molto utilizzati in PHP per la loro flessibilità.

Per creare un array associativo possiamo usare anche qui la funzione array o i simboli [], ma al loro interno dobbiamo inserire delle coppie nome => valore, vediamo un esempio:

    $arrAssociativo = array(

                            "uno"=>"primo elemento",

                            "due"=>"secondo elemento",

                            "tre"=>"terzo elemento"

                        );

Vediamo la parola uno seguita dalla freccia e poi dal valore effettivo di quella posizione dell’array, poi dopo la virgola vengono inseriti gli altri elementi uno dopo l'altro.

Stampare un elemento di un array associativo

Con gli array associativi non possiamo usare gli indici numerici, ma dobbiamo usare l’indice inserito a sinistra del simbolo “=>”. Ad esempio

il codice:

	echo $arrAssociativo["uno"];	

stamperà il primo elemento dell’array.

Iterare un array associativo

Dato che l'array associativo non possiede gli indici numerici per scorrere tutti gli elementi non possiamo usare il classico ciclo for, ma dobbiamo usare un nuovo costrutto: il foreach.

Questo costrutto itera gli elementi di un array e ad ogni iterazione inserisce il valore corrente all'interno della variabile passata dopo as. Vediamo un esempio:

        foreach($arrAssociativo as $nome) {

            echo "
  • Utente $nome
";

        }      

Con il foreach possiamo recuperare il valore dell'elemento ma anche la chiave, ad esempio se scriviamo:

        foreach($arrAssociativo as $chiave=>$valore) {

            echo "
  • $chiave $valore
";

        }

otterremo la stampa sia delle chiavi che del valore associato.

Funzioni per gli array

PHP mette a disposizione molte funzioni per operare sugli array, vediamo le principali:

 Nome funzione  Utilità
 explode Prende in input una stringa da suddividere in più parti e una stringa che deve essere usata come elemento divisore. Restitusice un array contenente le varie parti della stringa.

Esempio di utilizzo:
explode(“ ”,”I love php”)
 implode() Consente di inserire tutti gli elementi di un array in una stringa (gli elementi devono essere anch’essi di tipo stringa). Il primo parametro è il carattere da inserire tra un elemento e un altro

Esempio di utilizzo:
implode(" ",$arr)
 in_array Restituisce true se l’elemento da cercare è presente nell’array passato in input.

Esempio di utilizzo:
in_array($nomi,”Giovanni”)
 array_merge() Unisce uno o più array

Esempio di utilizzo:
in_array($nomi,”Giovanni”)
 print_r Stampa informazioni sull’oggetto passato in input, se è un tipo di dato elementare (stringa o numerico) stampa direttamente l’elemento, nel caso di un array stampa il suo contenuto

Esempio di utilizzo:
print_r($arr);
Leggi tutto

Cerca...