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 26/09/2020

9. Le funzioni in PHP

Spesso capita che dobbiamo usare un determinato pezzo di codice in più parti della nostra web application. Potremmo certamente ricopiare il codice ovunque ci serva, ma non è una buona idea: se dobbiamo cambiare quel codice dovremmo andarlo a modificare in tutti i punti in cui lo abbiamo scritto. Esiste un modo migliore per ottimizzare questo aspetto della programmazione: la creazione di funzioni.

Una funzione è un codice che può essere richiamato in altre parti del programma. In questo modo quando dovrà essere modificata dovremmo modficiare solo il codice contenuto nella funzione e non in tutti i punti in cui è stata chiamata. Per definire una funzione si deve usare la parola chiave function, ad esempio:

	function saluta() {

    echo "Ciao mondo!";

}

la funzione che abbiamo appena scritto stampa la scritta “Ciao mondo!”. Ovviamente il codice qui sopra definisce la fuzione, ma non la manda in esecuzione. Per eseguirla bisognerà richiamarla nel nostro codice scrivento:

	saluta();

Parametri di una funzione

una funzione può avere dei parametri passati in input, che vanno specificati nelle parentesi tonde. Vediamo un esempio:

	function saluta2($nome) {

    echo "Ciao $nome!";

}

Il parametro $nome può contenere qualsiasi valore, ad esempio posso chiamare la funzione in questo modo:

	saluta2("Mario");   

saluta2("Antonio");

Ho chiamato la funzione due volte, usando due nomi diversi, quindi PHP stamperà di volta in volta il nome che gli viene passato.

Nota: se la funzione non riceverà i parametri attesi (nel caso di saluta2 il parametro $nome) darà un errore.

Parametri preimpostati

È possibile assegnare un valore predefinito ai parametri. Vediamo ad esempio questa funzione:

	function saluta3($nome = “Mario”) {

    echo "Ciao $nome!";

}

Questa funzione può essere utilizzata come la funzione saluta2 vista sopra, ovvero:

	saluta3(“Antonio”);

ma può anche essere utilizzata senza parametri:

	saluta3();

In questo caso la funzione assegna alla variabile $nome il valore di default stabilito al momento della sua creazione.

È possibile anche avere un misto di parametri preimpostati e non. Ad esempio la funzione definita qui di seguito:

	function nuovaFunzione($parametro1, $parametro2 = “test”) {

echo “$parametro1 $parametro2”;

}

prende in input due parametri, di cui uno è preimpostato. Significa che questa funzione può essere chiamata in questo modo:

	nuovaFunzione(“valore1”, “valore2”);

oppure

	nuovaFunzione(“valore1”);

In questo esempio la funzione ha un solo parametro preimpostato, quindi se provassimo a richiamarla in questo modo:

	nuovaFunzione();

otterremmo un errore.

Inserire i tipi di dato

nei parametri in input possiamo specificare il tipo di dato, per rendere più sicuro il codice. Consideriamo la funzione:

	function cubo($numero) {

return $numero * $numero * numero;

}

se passiamo per errore un dato errato, ad esempio scriviamo:

	cubo(“cento”);

la funzione restituirà dei warning, ma lo script continuerà la sua esecuzione creando errori a cascata. Se invece modifichiamo la firma della funzione scrivendo:

	function cubo(int $numero) {

return $numero * $numero * numero;

}

in questo caso al momento di eseguire la funzione verrà generato un fatal error, che bloccherà l’esecuzione dello script.

Funzioni predefinite

PHP dispone di un gran numero di funzioni predefinite, che consentono di eseguire operazioni comuni. Sono tantissime, in questa tabella vediamo le principali.

Nome funzione  Utilità 
 strlen restituisce la lunghezza di una stringa

Esempio:
strlen($stringa)
 str_replace Sostituisce una sottostringa con un altro valore all’interno di una stringa

Esempio:
str_replace($trova,$sostituisciCon,$stringa)
 substr Restituisce una porzione della stringa passata in input. Prende in input, oltre alla stringa, la posizione di partenza e il numero di elementi da inserire nella sottostringa.

Esempio:
substr($stringa,0,20);
// restituisce i primi venti caratteri della variabile $stringa
 strtolower Restituisce la stringa con tutte le lettere in minuscolo

Esempio:
strtolower($stringa);
 strtoupper Restituisce la stringa con tutte le lettere in maiuscolo

Esempio:
strtoupper($stringa);
 htmlspecialchars Funzione che restituisce una stringa in cui i caratteri speciali della stringa passata in input sono convertiti in entità HTML.

Esempio:
htmlspecialchars(“”);

L’output di questo comando sarà:



I simboli “<” e “>” sono stati trasformati in entià HTML, rispettivamente in < e >

Questo fa si che il risultato visivo per l’utente sia lo stesso, ma l’interprete JavaScript non eseguirà questo codice in quanto non è racchiuso dal tag

Viene utilizzata quando dobbiamo stampare del codice in una pagina web (ad esempio a scopo didattico) oppure per rendere sicure delle stringhe passate in input (sebbene la soluzione ideale sia la funzione filter_input).
 exit Termina l’esecuzione del programma, tutto il codice che si trova dopo la chiamata di questa funzione non verrà eseguito.

Esempio:
exit();
 isset Consente di verificare se una variabile è stata creata o meno. Restituisce true se la variabile esiste, false altrimenti. Viene usata tipicamente negli if, in modo da fare delle azioni quando

Esempio:
if(isset($variabile)) {
      // se la variabile esiste esegue un certo codice
}
else {
      // se la variabile non esiste esegue altre azioni
}
 is_numeric Restituisce true se il valore passato in input è un numero, viene usata tipicamente all’interno di un if.

Esempio:
if(is_numeric($var)) {
      // eseguo il codice dell’if
}
 is_string Restituisce true se il valore passato in input è un numero, viene usata tipicamente all’interno di un if.

Esempio:
if(is_string($var)) {
      // eseguo il codice
}
 header Funzione per gestire gli header, viene usata tipicamente per reindirizzare l’utente in qualche altra pagina del nostro sito.

Esempio:
header(“Location: index.php”);
Leggi tutto

Andrea Pastore 27/09/2020

22. I template in PHP

Con la programmazione ad oggetti abbiamo introdotto il paradigma MVC, che consiste nel tener separate la definizione degli oggetti, logiche di controllo e le viste. Un modo ottimale per gestire le viste consiste nell'utilizzo file HTML contenenti il markup dell’elemento, ma con dei valori segnaposto che vengono sostituiti di volta in volta. Questi file HTML vengono chiamati template. Ogni volta che dovrà essere stampato un elemento di quel tipo (si pensi ad esempio a degli articoli) il codice PHP prenderà il template, sostituirà i valori segnaposto con quelli reali ed eseguirà la stampa.

Il vantaggio di questo approccio è ancora una volta nella manutenzione del codice, perché il codice HTML sarà separato dal codice PHP e sarà possibile riutilizzarlo tutte le volte che serve.

Facciamo un esempio su come avviene la gestione: supponiamo di dover inserire in una pagina una serie di articoli. Il codice degli articoli sarà sempre uguale, cambieranno solo i contenuti. Quindi possiamo creare un file che chiameremo articolo.html fatto in questo modo:

<div class=”articolo” >
<h1> _titolo_ </h1>
<h2> _sottottitolo_ </h2>
<p> _testo_ </p>
</div>

possiamo poi creare una funzione PHP che recupera queste informazioni e sostituisce gli articoli ogni volta:

	function renderizzaArticoli($titolo, $sottoTitolo,$testo) {
$codice = file_get_contents(“articolo.html”);
$codice = str_replace(“_titolo_”,$titolo);
$codice = str_replace(“_sottottitolo_”,$sottottitolo);
$codice = str_replace(“_testo_”,$testo);
echo $codice;
}

In questo modo il codice per recuperare gli articoli potrebbe essere:

	$query = “SELECT * FROM articoli”;
if(!$risQuery = $db->query($query)) {
                    echo "Errore durante l'esecuzione della query: ".$db->error;
                    echo "<br>$query";
                exit();
          }

while($articolo = $risQuery→fetch_assoc()) {
renderizzaArticoli($articolo[“titolo”], $articolo[“sottoTitolo”],$articolo [“testo”]);
}

Creiamo una funzione più generalista

La funzione renderizzaArticoli vista sopra svolge il suo dovere per stampare gli articoli ma è troppo specializzata, possiamo usarla solo per questo compito. Questo approccio non è l’ideale, perché ci costringe a creare una funzione per ogni oggetto che dobbiamo renderizzare. 

La soluzione migliore è costruire una funzione generalista, che non prenda parametri precisi ma un template e un array di parametri, che sostituisce di volta in volta:

	function renderizza($template, $parametri) {
$codice = file_get_contents($template);
foreach($parametri as $etichetta => $valore) {
                $ codice = str_replace("_$etichetta_",$valore,$codice);
            }
echo $codice;
}

Possiamo quindi riscrivere il codice visto sopra in questo modo:

	$query = “SELECT * FROM articoli”;
if(!$risQuery = $db->query($query)) {
                    echo "Errore durante l'esecuzione della query: ".$db->error;
                    echo "<br>$query";
                exit();
          }

while($articolo = $risQuery→fetch_assoc()) {
renderizza(“articolo.html”,array(“titolo”=>$articolo[“titolo”], ”sottoTitolo”=> $articolo[“sottoTitolo”], ”testo”=>$articolo [“testo”]));
}

In questo modo quando vorremmo utilizzare la stessa funzione per stampare altri tipi di elementi ci basterà cambiare il template HTML e i parametri dell’array. Un’altra ottimizzazione è quella di chiamare i campi della tabella e del template HTML allo stesso modo, in modo da passare direttamente l’array associativo ricavato dalla variabile $risQuery. Vediamo un esempio:

	$query = “SELECT titolo, sottoTitolo, testo FROM articoli”;
if(!$risQuery = $db->query($query)) {
                    echo "Errore durante l'esecuzione della query: ".$db->error;
                    echo "<br>$query";
                exit();
          }

while($articolo = $risQuery→fetch_assoc()) {
renderizza(“articolo.html”,$articolo);
}
Leggi tutto

Andrea Pastore 26/09/2020

8. Iterazioni

Il costrutto for

Quando programmiamo ci può capitare di dover ripetere più volte la stessa operazione, ad esempio si prenda in esame il seguente codice:

echo “Utente  1”

echo “Utente  2”

echo “Utente  3”

echo “Utente  4”

echo “Utente  5”

questa è un’operazione ripetitiva: stiamo scrivendo sempre la stessa cosa, cambia solo il numero finale. Per questo genere di operazioni possiamo utilizzare un costrutto che ci viene messo a disposizione dal PHP: il costruttor for. Lo stesso codice lo possiamo scrivere in questo modo:

for($i = 1; $i<6;$i++) {

echo “Utente $i”;

}

Analizziamo meglio il ciclo for: dopo la parola chiave for ci sono delle parentesi tonde che contengono i parametri necessari alla sua esecuzione, separati dal simbolo “;”:

  • variabile contatore e il suo valore iniziale, nell’esempio sopra rappresentato dalla stringa: $i = 0
  • valore limite della variabile contatore, nell’esempio sopra è $i<6
  • quantità da incrementare ad ogni iterazione, nell’esempio $i++ che è una scorciatoia offerta dal PHP per indicare che la variabile deve essere incrementata di 1. Invece di scrivere $i = $i +1 possiamo scrivere $i++.

Il ciclo while

Il ciclo while è un altro strumento per eseguire operazioni ripetitive, si differenzia dal ciclo for per il numero minore di variabili prese in input. Vediamo un esempio del ciclo while:

while($i<10) {

echo “Utente $i”;

$i++;

}

a differenza del ciclo for il while prende in input una sola condizione, ed esegue il codice contenuto tra le sue parentesi graffe fino a quando questa condizione è vera. La condizione del ciclo while può essere fatta con tutti gli operatori utilizzati all’interno dell’if (vedere la tabella di riferimento nel capitolo precedente).

Leggi tutto

Cerca...