devdev / in the loop
PHP PHP

Guida PHP 7 startup
Introduzione a OOP: Classi e Oggetti

Il paradigma della Programmazione orientata agli oggetti (OOP) è uno dei pilastri fondamentali di tutto lo sviluppo software attuale. Dopo anni, anche PHP supporta completamente la programmazione ad oggetti e nella versione attuale, la 7, dispone di tutte le funzionalità per creare programmi potenti, gestibili e ben strutturati. Questa lezione servirà di introduzione a concetti riguardanti Classi, Oggetti, Interfacce per poter sfruttare tutto il potenziale che la OOP ci offre.

Questa lezione è solo una veloce introduzione alla programmazione OOP di PHP 7, che ci serve per continuare a conoscere globalmente tutto il linguaggio per poi affrontare il nostro primo progetto di prova. Se conoscete già le basi del linguaggio, è disponibile una guida completa sulla Programmazione PHP 7 guru per comprendere ultime introduzioni come namespace, interface, trait, etc.

Se nei capitoli precedenti abbiamo visto del codice di un livello che potremmo definire basico, in questo capitolo inizieremo ad usare le conoscenze acquisite per costruire strutture che sono più in alto, cioè più astratte. Oggi, la programmazione ad oggetti è praticamente l’unico paradigma di sviluppo PHP usato, visto che il procedurale puro è in disuso, non tanto per la sua forma, quanto perché la OOP offre dei vantaggi notevoli. Il primo, il più banale è che permette di dividere il nostro codice in Classi, così da renderlo più gestibile e più semplice da riutilizzare. I veri punti di forza che rendono spettacolare lo sviluppo ad oggetti, stanno proprio nei 3 princìpi cardine degli oggetti: l’ereditarietà, il polimorfismo, l’incapsulamento.

Classi ed oggetti

Una classe è un modo per schematizzare e quindi rappresentare una entità del mondo reale. Definire una classe significa cioè costruire una struttura che può fare una serie di azioni, detti metodi, e ha una serie di proprietà (o attributi), e che serve da stampo per creare oggetti. Se ci pensiamo bene, il nostro principale compito come developer è quello di rappresentare la realtà che ci circonda con software, algoritmi e sistemi. Creando una classe creiamo una categoria di Oggetti, oltre che definire un tipo di dato. Ad esempio, possiamo pensare di creare la classe Automobile che possiede tutte le proprietà di un automobile, come il colore, il numero di porte, la cilindrata del motore ed anche dei metodi di comportamento, come mettere in moto il motore o accendere i fari. Questa operazione si chiama incapsulamento: mettiamo assieme dati e azioni per creare una qualcosa di definito che rappresenti un’entità del mondo reale. Proviamo a scrivere in PHP tutto questo:

<?php
   
class Automobile {

    // queste sono le proprietà o attributi
    public $fariAccesi;
    public $motoreAcceso=false;

    // questo è un metodo
    public function accendiMotore() {
        $this->motoreAcceso=true;
    }
}


?>

Come vediamo, abbiamo creato la classe Automobile specificando delle proprietà, che a tutti gli effetti sono variabili usando il codice

public $fariAccesi;

e un metodo mettiInMoto(), cioè un comportamento, che in sostanza è una funzione:

public function accendiMotore() {
    $this->motoreAcceso=true;
}

A questo punto, il metodo accendiMotore() modifica la proprietà variabile $motoreAcceso impostandola a TRUE. Per farlo, usa la pseudo-variabile $this che corrisponde all’oggetto stesso. Come facciamo ad usare la classe Automobile?

Semplice, creiamo un Oggetto, cioè un’istanza della Classe.

<?php
   
//questa è la classe vista in precedenza
class Automobile {

    public $fariAccesi;
    public $motoreAcceso=false;

    public function accendiMotore() {
        $this->motoreAcceso=true;
    }
}

// Assegniamo a $panda un'istanza della classe Automobile
$panda = new Automobile;

// Chiamiamo un metodo
$panda->accendiMotore();

?>

Per creare un istanza di una classe, usiamo la parola new seguita dal nome della Classe. A questo punto, abbiamo accesso a tutti i metodi e le proprietà della classe di partenza. Nel nostro caso, $panda è un’istanza della classe Automobile e, pertanto, possiamo usare il metodo accendiMotore().

Costruttore e distruttore

Quando creiamo o distruggiamo un oggetto, l’interprete PHP chiama automaticamente i rispettivi metodi __construct() e __destruct() della classe. Possiamo sfruttare questo meccanismo per ridefinire questi metodi per eseguire delle operazioni a nostro piacimento ed estenderne magari le funzionalità.

<?php
   
class Automobile {

    function __construct() {
        echo "Sono il metodo costruttore":
    }
     
    function __destruct() {
        // ...
    }
}


?>

Ereditarietà

Uno dei capisaldi della OOP è la capacità di una classe di estendere un’altra classe. Possiamo cioè creare una nuova classe che eredita metodi e proprietà di un’altra classe già esistente. Si creerà così un legame tra una classe genitore e una classe figlio: in quest’ultima saranno presenti tutti i metodi e le proprietà della classe genitore – come già accennato – e potremo aggiungere nuovi metodi o proprietà o ridefinire quelli ereditati. Andremo così ad estendere delle funzionalità preesistenti o riscrivere al meglio dei metodi già scritti in precedenza.

<?php
   
class Automobile {
    public $fariAccesi;
    public $motoreAcceso=false;

    public function accendiMotore() {
        // ...
    }
}

class AutomobileCabrio extends Automobile {
    public function apriCapote() {
        // ...
    }
}

$auto=new Automobile;
$auto->accendiMotore();

$auto_cabrio=new AutomobileCabrio;
$auto_cabrio->accendiMotore();
$auto_cabrio->apriCapote();

?>

Nel nostro esempio, data la classe Automobile già vista in precedenza, definiamo una nuova classe AutomobileCabrio che la estende, attraverso la keyword extends, e aggiunge un nuovo metodo apriCapote() che sarà disponibile soltanto in AutomobileCabrio. Possiamo quindi dire che la classe AutomobileCabio eredita la classe Automobile e ne possiede tutti i metodi e tutte le proprietà. Potremmo creare oggetti indipendenti a partire da ciascuna delle due, perché ovviamente Automobile rimane una classe valida e usabile.

Visibilità di proprietà e metodi

Come avrete notato, alcuni metodi sono preceduti dalla parola public. PHP ha a disposizione un sistema per gestire la visibilità di proprietà e metodi attraverso l’uso delle keyword public, protected e private.

<?php

class Test {
    
    public $a = 'Sole';
    protected $b = 'Marte';
    private $c = 'Venere';

}

$oggetto = new Test;
echo $oggetto->a; // Funziona
echo $oggetto->b; // Errore
echo $oggetto->c; // Errore

?>
  • Proprietà e metodi definiti public saranno accessibili da qualunque posto
  • Proprietà e metodi definiti protected saranno accessibili soltanto dalla classe stessa e dalle classi che la ereditano
  • Proprietà e metodi definiti private saranno accessibili solo dalla classe che li definisce

Se non specifichiamo alcuna keyword, saranno definiti public di default.

Polimorfismo

Come abbiamo appena visto, in PHP possiamo facilmente estendere le funzionalità di una classe preesistente. A volte, però, è necessario usare i metodi della classe genitore che sono stati ridefiniti nella classe figlio. Teniamo a mente , quindi, che il metodo non viene sovrascritto: sarà sempre possibile accedere al metodo originario della classe genitore, se ne avremo bisogno.

Metodi statici

È possibile creare dei metodi di una classe che sono accessibili direttamente, senza prima creare un’istanza dell’oggetto. Si usano, quindi, come delle comuni funzioni, chiamandole direttamente. Per farlo, specifichiamo la keyword static quando definiamo il metodo:

<?php

class Test {
    public static function metodoStatico() {
        // ...
    }
}

Test::metodoStatico();

?>

Per chiamare un metodo statico, è necessario usare il simbolo :: come nell’esempio precedente.

Proprietà statiche

Come per i metodi, è possibile definire delle proprietà statiche, accessibili attraverso doppi due punti ::

<?php

class Test {
    public static $proprieta = 'ciao';
}

echo Test::$proprieta;

?>

Gli oggetti sono strumenti potenti

Questa lezione è da considerarsi come un capitolo introduttivo alla programmazione orientata agli oggetti. Conoscerne le basi, infatti, ci servirà per completare questa guida ed avere una conoscenza complessiva di tutte ciò che offre PHP. Quando sarete pronti, potremo passare alla Guida PHP 7 guru per capirne tutte le possibilità e le ultime introduzioni.

Capitolo successivo → $_GET e $_POST
Precedente ← Le funzioni
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.