Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 31 di 50
  • livello avanzato
Indice lezioni

Istanziare una classe: il costruttore

Il metodo costruttore: decidere il comportamento dell'oggetto al momento della sua creazione
Il metodo costruttore: decidere il comportamento dell'oggetto al momento della sua creazione
Link copiato negli appunti

Come ho accennato nella terza lezione, è possibile passare dei parametri dopo il nome della classe nella fase di creazione delle istanze. In questa lezione cercheremo di capire perché ciò avviene ed in che modo è possibile personalizzare la creazione delle istanze.

Prendiamo come esempio la classe MyClass che abbiamo dichiarato nel corso delle lezioni precedenti:

class MyClass {
        // proprietà
        public $a = 10;
        public $b = 20;
        // metodi
        public function sayHello() {
                echo "Hello! " . $this->a . " " . $this->b;
        }
}
$myClass_1 = new MyClass();
$myClass_2 = new MyClass;

Come possiamo vedere, la lista dei parametri è vuota in entrambe le dichiarazioni: addirittura è possibile omettere le parentesi se la classe non presenta un costruttore pubblico. Ciò significa che in questo caso non abbiamo modo di influire sui parametri della classe mentre stiamo istanziando un oggetto: tutte le istanze avranno inizialmente le stesse proprietà impostate agli stessi valori. Questo rappresenta ovviamente un limite, ma grazie al metodo costruttore, è possibile decidere quale comportamento deve assumere l'oggetto quando viene creato.

Il metodo costruttore infatti, viene richiamato nella fase di creazione dell'oggetto e si dichiara tramite la funzione (o metodo magico) __construct (esistono svariati metodi magici nella OOP di PHP, che sono contrassegnati dal doppio underscore "__" iniziale e che verranno analizzati dettagliatamente nella successive lezioni). Ecco un esempio di classe avente un costruttore:

class MyClass {
        // proprietà
        public $a = 10;
        public $b = 20;
        // costruttore
        public function __construct($a, $b) {
                $this->a = $a;
                $this->b = $b;
        }
        // metodi
        public function sayHello() {
                echo "Hello! " . $this->a . " " . $this->b;
        }
}
// creazione delle istanze
$myClass_1 = new MyClass(40, 40);
$myClass_2 = new MyClass("a", "b");

La funzione __construct viene richiamata in fase di creazione delle istanze, in questo modo, è possibile fare assumere alla classe qualsiasi comportamento si voglia: nel nostro caso abbiamo dato la possibilità di specificare i valori delle proprietà a e b. Dato che nella funzione non abbiamo inserito nessun controllo sul tipo dei parametri, possiamo passare numeri (40, 40), stringhe ("a", "b") e così via.

Ovviamente in questo caso, non possiamo omettere i parametri nella fase di creazione delle istanze, altrimenti PHP genererebbe un E_WARNING che ci avvisa della mancata presenza dei parametri richiesti dal costruttore:

Warning: Missing argument 1 for MyClass::__construct(), called in [...] on line 80 and defined in [...] on line 67

Warning: Missing argument 2 for MyClass::__construct(), called in [...] on line 80 and defined in [...] on line 67

Sfruttando la potenza del metodo costruttore, possiamo essere veramente creativi compiendo svariate operazioni ed imponendo controlli al suo interno:

class MyClass {
        // proprietà
        public $a = 10;
        public $b = 20;
        // costruttore
        public function __construct($a, $b) {
                // gli argomenti devono essere interi
                if(!is_int($a) || !is_int($b)) exit("The arguments must be integers!");
                // gli argomenti devono essere minori di 100
                if($a > 100 || $b > 100) exit("The arguments must be less than 100!");
                $this->a = $a;
                $this->b = $b;
                // connessione ad un nostro dataase interno
                connect_to_my_db($this->a, $this->b);
                // operazioni...
        }
        // metodi ...
}
// creazione delle istanze
$myClass_1 = new MyClass(40, 80);               // ok
$myClass_2 = new MyClass("a", "b");             // errore: "The arguments must be integers!"

Conclusione

Tramite l'uso del metodo costruttore, che rappresenta il metodo più importante in assoluto nella OOP, è possibile personalizzare il comportamento della classe in fase di creazione delle istanze e dunque favorire l'impostazione dei parametri direttamente tramite un'unica linea di codice. Ma se esiste un metodo che viene richiamato quando si creano gli oggetti, è altrettanto vero che ne esiste un altro che viene richiamato quando si distruggono: quest'ultimo prende il nome di distruttore e verrà analizzato direttamente nella prossima lezione.

Ti consigliamo anche