Guida PHP

Introduzione

PHP è un potentissimo linguaggio di scripting general purpose che consente di creare complesse applicazioni lato server specialmente indicato per lo sviluppo web perchè può essere facilmente integrato nell'HTML.

PHP si differenzia poi dai linguaggi di scripting client side, come per esempio JavaScript, per via del fatto che il sorgente viene eseguito nel server, generando markup HTML da inviare al client; quest’ultimo riceverà i risultati dell’esecuzione di un’applicazione ma il codice eseguito non sarà mai visibile.

Perche sceglierlo:

  • Open Source e questo lo rende gratuito e supportato dalla community
  • È utilizzabile su qualsiasi sistema operativo e in diversi casi d’uso, ma il suo habitat naturale è lo stack LAMP ( Linux, Apache, mySql, PHP) per lo sviluppo web.
  • Ottimo trade-off tra facilità di scrittura e velocità di esecuzione (non è il più veloce in assoluto, ma neanche il più difficile)
  • È uno dei più usati linguaggi web e questo rende facile la risoluzione dei problemi, potendo contare su una community molto ampia e attiva


PHP è multipiattaforma, cioè può essere utilizzato sia in ambienti unix-based (Linux, Mac OSX) che su Windows. La combinazione più utilizzata, però, resta quella LAMP ovvero Linux come sistema operativo, Apache come Web server, MySQL per i database e PHP.

Storia

PHP nasce nel 1994 come proggetto personale Rasmus Lerdorf. Inizialmente esso veniva presentato come una serie di Common Gateway Interface (CGI) binari scritti in C per tracciare il numero di visite all’interno della suo homepage personale. Da qui il primo nome del PHP: Personal Home Page. In seguito però verrà rinominato in Hypertext Preprocessor
E' stato adottato da una ampia community che lo ha migliorato (e trasformato) fino alla attuale versione PHP7 rilasciata nel 2015 che “is up to twice as fast as PHP 5.6”

Differenze con JavaScript

JavaScript

  • È un linguaggio client-side
  • È eseguito nel sistema dell’utente, direttamente sul suo browser
  • Può interagire real time con l’utente. Ad azione si può scatenare una reazione
  • Il codice viene (analogamente a come succede con l’HTML) spedito al browser dell’utente. L’utente può vedere il codice JS
  • Manipola il codice finale

PHP

  • È un linguaggio server-side
  • È eseguito direttamente sul server, dove è “hostato” il sito
  • Non può reagire ad evento scatenato dall’utente
  • Il codice, compresi commenti non è visualizzabile dall’utente
  • Crea il codice finale che verrà poi utilizzato dal browser, da lì, non ha più effetti

Ambiente di lavoro

Per sviluppare in PHP non sono necessari di molti strumenti, il set up della macchina è piuttosto veloce e si è operativi in breve tempo. Vediamo di quali soluzioni abbiamo bisogno:

  • un server Web
  • PHP
  • un editor di testo (Atom, PhpStorm)
  • un browser per la navigazione Internet
  • un gestore di database per l’eventuale interazione con i dati

La scelta del server Web dipende innanzitutto dal sistema operativo su cui si sta lavorando. Nonostante sia preferibile che i nostri script girino su un server Linux), possiamo tranquillamente progettarli sulla nostra macchina, indipendentemente dal sistema operativo installato.

Software per l’installazione automatica dell’ambiente di sviluppo

Sono presenti in Rete anche numerosi PHP development environment che installano e configurano automaticamente i software ed i servizi di cui abbiamo bisogno;
Alcuni sono cross-platform, altri sono specifici per una piattaforma.

Software MAC Windows Linux
AMPPS V V V
WAMP V
XAMPP V V V
MAMP V V

Per la facilità di utilizzo useremo - MAMP

Le Variabili

PHP non è un linguaggio fortemente tipizzato, quindi non è neccesario diachiarare il tipo di dato in anticipo, il linguaggio lo riconoscera in automatico.

Le variabili sono uno degli strumenti fondamentali di ogni linguaggio di programmazione. Una variabile è una porzione di memoria in cui viene memorizzato un dato che può variare durante l’esecuzione del programma.

La sintassi per dichiarare una variabile in PHP è la seguente:

<?php // code ?>

Output delle variabili:

<?php $name = "Alessandro" ; echo "Il mio nome è" . $name
OUTPUT: Il mio nome è Alessandro ?>

Il GET

Per recuperare i paramentri inseriti nel url si utilizza il GET

url: http://www.example.com/file.php?language=php <?php $_GET['language']; // restituira: php ?>

Le Stringhe

PHP mette a disposizione un set completo di funzioni che permettono di manipolare ed eseguire le operazioni sulle stringhe.

  • echo $variabile - stampa il contenuto della variabie
  • explode(delimitatore, stringa) - creerà un array dividendo su un delimitatore una stringa
  • trim(stringa) - toglierà gli spazi bianchi all’inizio e alla fine di una stringa
  • str_replace(daModificare, conCosa, stringa) - cambierà il valore di una porzione della stringa in un altro
  • strlen(stringa) - ritorna la lunghezza di una stringa
  • strpos(stringa, cosaCercare) - cerca all’interno di una stringa un’altra stringa e torna la posizione
  • ucfirst(stringa) - ucwords(stringa) - rende maiuscola o il primo carattere o il primo carattere di ogni parola

L'elenco completo funzioni stringhe php

Gli operatori

Molti operatori sono identici a quelli già visti in JavaScript, altri sono leggermente diversi.

operatore descrizione esempio
&& And (logico) And (logico) aggiunge una condizione necessaria
|| OR (logico) aggiunge una condizione in sostituzione
== (uguaglianza) se x = 3, allora x == 4 è falso
!= (diversità) se x = 3, allora x != 4 è vero
> (maggiore di) se x = 3, allora x > 4 è falso
< (minore di) se x = 3, allora x < 4 è vero
>= (maggiore o uguale) se x = 3, allora x >= 4 è falso
<= (minore o uguale) se x = 3, allora x <= 4 è vero
$i++ o $i-- Incremento o Decremento
+=, -=, *=, /= Prende il valore di un numero e aggiunge, o sottrae o moltiplica o divide per il valore

If, else, istruzioni condizionali in PHP

L’istruzione if è forse la più rappresentativa tra le strutture di controllo del flusso: ci permette di eseguire o non eseguire certe porzioni di codice.

If funziona esattamente come in Javascript.

Attenzione a elseif può essere scritto senza spazi!

Var_dump

La funzione var dump in PHP, var_dump(), consente di visualizzare le informazioni contenute nelle variabili, specificando sia il tipo sia il valore.

Per rendere la lettura dell'output del var_dump più pretty possiamo attivare xdebug
Per farlo bisogna modificare le impostazioni di php sul nostro ambiente di sviluppo. Quindi modificando il file php.ini.

  • Apriamo la cartella di MAMP C:/MAMP/conf/php.7.vostraVersione
  • Apriamo il file php.ini e cerchiamo xdebug
  • Cancellate il ; davanti a extension -> ;extension-php_xdebug.dll
  • Fermate i server e riavviate MAMP

Leggere gli errori

Possiamo vedere gli errori generati da PHP o da Apache leggendo i log contenuti nella cartella dell'ambiente di sviluppo (in MAMP).

Apriamo il terminale e con il comando cat leggiamo il testo contenuto in un file da terminale.
Win: C:/MAMP/logs
Mac: /Applications/MAMP/logs

per leggere gli errori di php digitate
cat php_error.log

per leggere gli errori di apache digitate
cat apache_error.log

Se vogliamo rimanere in ascolto di ogni cambiamendo del file:
Win: gc -Path nomeFile -Wait
Mac/linux: tail -f nomefile

Gli Array

Gli array possono contenere più valori, possono contenere anche tipi di dati diversi, dunque anche oggetti o altri array.

Si può creare un array utilizzando la funzione array oppure, dalla versione 5.4 di PHP si può creare un array con una sintassi più semplice utilizzando le parentesi quadre.

Array associativo

Un altro modo molto di utilizzare gli array è quello di sfruttare gli indici come stringhe anziché come valore numerico:

Funzione Array

$persona = array(   'name'=>'Alessandro',   'lastname'=>'Orlov',   'employment'=>'developer', );

Parentesi quadre

$persona = [ 'name'=>'Alessandro', 'lastname'=>'Orlov', 'employment'=>'developer' ];

I due esempi si equivalgono. In ogni momento possiamo visualizzare il contenuto di un array con la funzione print_r(), utile in caso di debug:

print_r($persona);

Accedere agli elementi dell'array

Per accedere agli elementi dell’array in PHP possiamo indicare il nome dell’array e specificare la chiave tra parentesi quadre. In questo modo:

echo $persona['name']; // OUTPUT: Alessandro

Aggiungere dati in un array

E' possibile aggiungere un elemento ad un array con chiave standard o con chieve definita dall'utente

Chiave standard Chieve definita dall'utente
$persona = [   'Alessandro',   'Orlov',   'developer', ]; Aggiungiamo valore età $persona[] = 33; Ora l'array avrà 4 elementi $persona = [ 'name'=>'Alessandro', 'lastname'=>'Orlov', 'employment'=>'developer' ]; Aggiungiamo valore età $persona['age'] = 33; Abbiamo aggiunto la chiave age con il valore 33

Eliminare un elemento di un array

Per eliminare un elemento di un array PHP si utilizza la funzione unset() in questo modo:

unset($persona['age']);

Così facendo verrà eliminato l'elemento con chiave 'age' all'interno del nostro array $persona.

Array multidimensionali

E' possibile creare array contenente altri array, questo tipo di dato vine chiamato array multidimensionale.

$people = [ //primo array che contiene tanti array   "Michele Papagni" => [ // secondi livelli, ognuno con la propria chiave     "Role" => "Teacher",     "Age" => 29   ],   "Fabio Forghieri" => [     "Role" => "Teacher",     "Age" => 30   ], ];

Le funzioni PHP per gestire gli array

Come per le stringhe, ci sono tantissimi metodi disponibili in PHP per la manipolazione e la lettura degli array.

Alcuni esempi:

  • count(array) - restituisce il numero totale degli elementi in array
  • shuffle(array) - mescola gli elementi all’interno di un array
  • array_reverse(array) - inverte l’ordine degli elementi in un array
  • array_slice(array, 0, 3) - Abbiamo scelto di estrarre 3 elementi a partire dal primo
  • array_key_exists(key, array) - restituisce true se la chiave esiste, altrimenti false
  • in_array(value, array) - restituisce true se il valore è presente nell’array altrimenti false
  • array_keys(array) - restituisce tutte le chiavi dell’array.
  • array_values(array) - restituisce tutte i valori delle chiavi dell’array.
  • array_merge(array1, array2 ...) - Unisce due o più array
  • array_search(value, array) - Cerca il valore all’interno di un array e restituisce la chiave della prima occorrenza trovata.

Elenco completo qui.

Ciclare il contenuto di un array

Gli array prevedono un tipo speciale di ciclo: il ciclo foreach
Di piu su foreach qui

I cicli PHP

I cicli sono un altro degli elementi fondamentali di qualsiasi linguaggio di programmazione in quanto permettono di eseguire determinate operazioni in maniera ripetitiva. Si tratta di una necessità che si presenta molto frequentemente

for, while & do while

Sono assolutamente identici a quelli che abbiamo visto con JavaScript, oltre che nell’utilizzo anche nella forma. il funzionamento è descritto qui

foreach

Il foreach è forse il ciclo più usato in PHP e si utilizza per ciclare su un array, sia con chiavi standard che con chiavi custom.

Stampiamo un array con chiavi standard:

$peoples = [ 'Michele', 'Fabio', 'Roberto', ]; foreach ($peoples as $person) { echo $person; } // OUTPUT SARA': Michele, Fabio, Roberto

Possiamo utilizzare il ciclo foreach allo stesso modo, ciclare sugli elementi e stamparli a schermo, o riciclare con un foreach dentro un altro foreach per stampare, ad esempio, i nomi dei maestri a schermo.

$roles = [ 'teachers' => ['Fabio', 'Michele'], 'PM' => ['Roberto'], ]; foreach ($roles as $role) { var_dump($role); } // Output sarà: array (size=2) 0 => string 'Fabio' (length=5) 1 => string 'Michele' (length=7) array (size=1) 0 => string 'Roberto' (length=7)

Ma se volessimo controllare il nome della chiave per cambiare la nostra azione?

foreach ($nomeArray as $chiave => $elementoArray)

$classData = [   'teachers' => ['Fabio', 'Michele'],   'nStudents' => 10, ]; foreach ($classData as $k => $classDatum) {   if ($k == 'teachers') {     foreach ($classDatum as $teacher) {         echo $teacher;     }   } else {     echo 'nomero di studenti è: ' . $classDatum;   } }

break & continue

Break

Il costrutto break consente di interrompere un ciclo e di uscirne senza continuare le iterazioni rimanenti. È molto utile, ad esempio, quando si cerca un valore all’interno di un array: nel momento in cui l’elemento viene trovato non è necessario continuare con altri gli elementi

Ad esempio:

$atleti = ['Simone', 'Josephine', 'Giuseppe', 'Gabriele' ];   $posizione_di_arrivo = 0;   foreach ($atleti as $posizione => $nome) {     if ($nome == 'Josephine') {       $posizione_di_arrivo = $posizione + 1;       break;     }   } echo "Josephine è arrivata in posizione numero " . $posizione_di_arrivo;

Non appena troviamo l’utente che stiamo cercando non è più necessario continuare le iterazioni per i restanti atleti ma possiamo interrompere l’esecuzione del ciclo. Per raggiungere il nostro scopo è sufficiente utilizzare la struttura di controllo break.

Il costrutto break è utilizzato anche nello costrutto condizionale switch

Continue

La struttura di controllo continue è utilizzata per saltare il ciclo corrente e proseguire con le iterazioni successive previste.

Ad esempio:

for ($posizione=1; $posizione <= 10; $posizione++) {   if ($posizione % 2 == 1) {     continue;   } echo "Il numero " . $posizione . " è un numero pari\n"; }

In questo esempio nel caso in cui un valore del ciclo non è divisibile per 2, saltiamo l’iterazione e passiamo direttamente a l'iterazione successiva.

Funzioni custom

Una delle funzioni interessanti è la funzione rand()
serve per stampare un numero random, ed è utilizzata in questo modo:

// stampo un numero random da 1 a 100 $randomNumber = rand(1, 100); echo $randomNumber;

E se volessimo creare un array di numeri tutti diversi?

Argomenti: min, max e numItems sono numeri interi public function getArrayOfIntegers($min, $max, $numItems) {   $arrayOfNumbers = [];   while(count($arrayOfNumbers) < $numItems) {     $number = rand($min, $max);     if(!in_array($number, $arrayOfNumbers)) {       $arrayOfNumbers[] = $number;     }   }   return $arrayOfNumbers; } Evochiamo la funzione: getArrayOfIntegers(1, 100, 50); Cosi abbiamo ottenuto un array di 50 numeri da 1 a 100, tutti numeri diversi

OOP - Programmazione Orientata ad Oggetti

OOP - Object oriented programming

Gestire grandi progetti richiede grandi quantità di codice che, cresce velocemente di complessità.

L’approccio OOP introduce regole per promuovere le seguenti pratiche:

  • Modularità
  • Riutilizzo del Codice
  • Isolamento
  • Estensibilità

Le Classi

Alla base della OOP c’è il concetto di Classe.
Una classe è un modello che descrive un preciso pezzo di realtà

Ad esempio:

  • Un'auto
  • Un animale
  • Un utente di un sistema di contenuti

Le istanze o oggetti

Una Classe, nel momento in cui viene implementata, genera una istanza (o oggetto).
Le istanze sono le concretizzazioni di quel modello.

Ecco l'esempio:

  • La classe Auto ha 2 istanze: l’auto Alfa Romeo e l’auto BMW
  • La classe Utente ha 3 istanze: Gli utenti Pippo, Pluto e Mikey

Classe PHP - Sintassi

Per creare una classe in PHP abbiamo bisogno di:

  • keyword: class
  • nome della classe il nome di una classe si indica in PascalCase.
class User { // variabili (o attributi) }

Per generare gli oggetti/istanze di quella classe abbiamo bisogno di:

  • keyword: new
  • nome della classe richiamiamo la classe con le parentesi tonde, proprio come si invoca una funzione.
//Istanza 1 $pippo = new User(); // Istanza 2 $pluto = new User();

N.B: Ogni istanza è come una copia della classe di partenza.
Hanno in comune le caratteristiche espresse nella classe, ma sono mondi separati.

Variabili (o attributi) nelle classi

Le classi possono avere delle variabili, dette attributi.

// Creo la classe class User {   public $nome; // attributo nome   public $email; // attributo email }

Per accedere all'attributo di un istanza ci serviamo dell'operatore ->

$pippo = new User(); $pippo->nome = "Pippo" $pippo->email = "pippo@email.it"

Metodi nelle Classi

Le Classi possono avere delle funzioni, dette metodi, pertinenti a ciò che rappresentano.

Ogni istanza avrà a disposizione tutti metodi definiti nella classe.

Esempio:

class User {   public $nome;   public $sconto = 0;   // Creo la funzione detta metodo per settare lo sconto:   public function setSconto($eta) {     if($eta > 65) {     $this->sconto = 40;     }   }   // Metodo per leggere lo scondo dell'istanza   public function getSconto() {     return $this->sconto;   } }

Per accedere ai metodi di un istanza ci serviamo del operatore ->

$pippo = new User(); $pippo->setSconto(40); $sconto = $pippo->getSconto();

Costruttori

Ogni Classe può avere un particolare tipo di funzione, chiamata costruttore.

Il costruttore permette di eseguire azioni nel momento in cui viene creata l’istanza della classe.

// creo la classe User class User {   public $nome;   public $eta;   function __construct($eta) {   $this->eta = $eta;   } }

Se prevediamo un argomento per il costruttore, dobbiamo fornire il relativo valore al momento della creazione dell’istanza.

$pippo = new User(50); // La manifestazione del costruttore nell’istanza sono proprio le parentesi tonde. echo $paperino->eta; // 50

Ereditarietà

L’ereditarietà è una possibile relazione da due classi.

Una classe B eredita da una classe A quando riceve tutti i metodi e le proprietà di A e ne aggiunge altri che meglio specificano le caratteristiche di B.

Questa ereditarietà si scrive in questo modo:
class NomeClasseFiglia extends NomeClasseGenitore

Ad esempio:

// Classe User class User {   public $nome;   public $sconto = 0;   public function setSconto($eta) {     if($eta > 65) {     $this->sconto = 40;     }   }   public function getSconto() {     return $this->sconto;   } }

Una classe Employee che ha gli stessi argomenti e metodi della classe User:

class Employee extends User {   public $livello;   public function setLivello($livello) {     $this->livello = $livello;   } }

Ereditarietà: Polimorfismo

Se volessimo avere nella classe figlia una funzione(o metodo) con lo stesso nome e con un codice diverso all’interno rispetto alla classe Genitore, il metodo della classe figlia riscriverebbe il metodo del genitore ma solo per questa istanza.

Traits

In PHP non è possibile ereditare da più classi, perché è un single inheritance language. Esiste però un modo per riutilizzare il codice in più classi - Traits

I trait possono essere usati per creare proprietà da applicare a più classi.

Creare trait

Per creare una trait abbiamo bisogno di:

  • keyword: trait
  • nome trait il nome di una trait si indica in PascalCase.
trait Position {   public $lat;   public $lng;   public function getAddress() {     return $address;   } }

Collegare trait

Per collegare una trait ad una classe abbiamo bisogno di:

  • keyword: use
  • nome trait richiamiamo il trait per nome.

E succisivamente si applica alla classe che vogliamo che abbia le proprità di trait:

// estendo la classe Employee con gli argomenti e metodi di User class Employee extends User {   // Collego trait   use Position;   public $name;   public $email; }

Visibilità

Per migliorare i concetti di isolamento, possiamo restringere l’accesso a metodi e variabili secondo determinate condizioni.

  • public I metodi e le variabili public saranno accessibili da qualsiasi file o metodo abbia accesso all’istanza.
  • protected Potranno essere utilizzati all’interno della classe o dalle classi che derivano da essa, ma non dall’esterno della classe
  • private Potranno essere utilizzati solo all’interno della classe dove sono stati dichiarati

Connesione al database

Tra i database più utilizzati per l'interazione con PHP è sicuramente, il noto RDBMS (Relational Database Managment System) MySQL, una soluzione per lo storage e la manipolazione dei dati rilasciata sotto licenza Open Source oggi implementata all'interno dei laboratori della Oracle.

Perché PHP possa interagire con le basi di dati di MySQL abbiamo la necessità di disporre di apposite librerie, queste ultime rappresenteranno l'interfaccia attraverso la quale le applicazioni potranno autenticarsi con l'engine, connettersi ad esso, selezionare i database con cui operare e utilizzare i dati archiviati; nello specifico, per l'interazione con MySQL il linguaggio dispone di tre diverse estensioni:

  • MySQLi - (MySQL improveded): si tratta di un'estensione pensata specificatamente per MySQL e introdotta in PHP con la versione 5; essa rappresenta in pratica un'evoluzione rispetto alle MySQL functions (ormai deprecate).
  • PDO - (PHP Data Objects): si tratta di una libreria introdotta con la versione 5 di PHP che fornisce un livello di astrazione (Abstraction Layer) grazie al quale il codice basato su di essa potrà essere riutilizzato indipendentemente dal database relazionale di riferimento;
  • MySQL Functions - con il rilascio di PHP 5.5 le MySQL functions sono state classificate come deprecate (ancora disponibili ma il cui utilizzo viene sconsigliato) e verranno definitivamente rimosse nel prossimo futuro.

MySQLi

Per consentire la connessione tra applicazione e DBMS sarà necessario disporre di parametri richiesti, è una buona pratica mettere questi parametri in un file separato env.

Parametri (file env.php)

  • $host cioè l'indirizzo della postazione che ospita l'installazione di MySQL
  • $username il nome dell'utente che possiede i permessi per effettuare operazioni che prevedano l'interazione con il DBMS e i dati da esso gestiti
  • $password la parola chiave per autenticarsi su MySQL.
  • $dbname nome del database
// parametri (file env.php) $servername = "localhost"; $username = "root"; $password = "root"; $dbname = "nome-database";

Tali informazioni potranno essere utilizzate per la creazione di una stringa di connessione rappresentata dall'istanza dell'oggetto di classe mysqli;

Connesione al database (file database.php)

La connessione avviene con la creazione di una nuova classe mysqli;
è una buona pratica metterlo in un file separato database

// Includiamo il file di parametri: include __DIR__ . "/env.php"; // Colleghiamo il database con la classe mysqli $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn && $conn->connect_error) {   die("Connection failed: " . $conn->connect_error); }

Query e risultato (file server.php)

Il file server contiente la query e il risultato che è rappresentano dalla variabile che è un array multidimensionale.

// Includiamo il file database.php include __DIR__ . "/database.php"; // query: seleziono tutto dalla tabella 'stanze' , ordino per 'room_number' in maniera ascendente $sql = "SELECT * FROM `stanze` ORDER BY `room_number` ASC"; // results $results = $conn->query($sql); if ($results && $results->num_rows > 0) {   $rooms = [];   // Put single row (that rappresents single room) in array ($rooms)   while($row = $results->fetch_assoc()) {     $rooms[] = $row;   } } elseif ($results) {   // 0 results   $rooms = []; } else {   echo "query error"; } $conn->close();

In questo modo abbiamo ottenuto un'array $rooms che possiamo stampare con un normalissimo foreach

PDO

Guida alla connesione al database con il PDO qui

PHP CRUD

Esempio pratico delle funzionalita CRUD in PHP e l'utilizzo di mysqli per la connessione al database al seguente link