Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

PHP orientato agli oggetti con classi e oggetti

by
Difficulty:BeginnerLength:LongLanguages:

Italian (Italiano) translation by Cinzia Sgariglia (you can also view the original English article)

In questo articolo, esploreremo le basi della programmazione orientata a oggetti in PHP. Cominceremo con un'introduzione alle classi e agli oggetti, e parleremo di un paio di concetti avanzati come l'ereditarietà e il polimorfismo nella seconda metà di questo articolo.

Che cos'è la programmazione orientata agli oggetti (OOP)?

La programmazione orientata agli oggetti, comunemente indicata come OOP, è un approccio che consente di sviluppare delle applicazioni complesse in un modo che è facilmente gestibile e scalabile a lungo termine. Nel mondo dell'OOP, entità reali come Persona, Auto o Animale sono trattate come oggetti. Nella programmazione orientata agli oggetti, interagite con l'applicazione utilizzando gli oggetti. Questo contrasta con la programmazione procedurale, dove interagite principalmente con le funzioni e le variabili globali.

Nell'OOP, c'è un concetto di "classe", che viene utilizzato per modellare o mappare un'entità del mondo reale a un modello di dati (proprietà) e di funzionalità (metodi). Un "oggetto" è un'istanza di una classe, e potete creare più istanze della stessa classe. Per esempio, c'è una sola classe Persona, ma molti oggetti di persona possono essere istanze di questa classe — dan, zainab, hector, ecc.

La classe definisce le proprietà. Per esempio, per la classe Persona, potremmo avere nome, età e numeroTelefono. Quindi ogni oggetto di persona avrà i propri valori per tali proprietà.

Potete inoltre definire dei metodi nella classe che vi consentono di modificare i valori delle proprietà dell'oggetto e di eseguire operazioni sugli oggetti. Per esempio, potete definire un metodo salva che salva le informazioni dell'oggetto in un database.

Che cos'è una classe PHP?

Una classe è un modello che rappresenta un'entità reale, e definisce le proprietà e i metodi dell'entità. In questa sezione, discuteremo l'anatomia di base di una tipica classe PHP.

Il modo migliore per comprendere i nuovi concetti è con un esempio. Così diamo un'occhiata alle classe Employee nel seguente frammento, che rappresenta l'entità dipendente.

L'istruzione class Employee nella prima riga definisce la classe Employee. Quindi, andiamo a dichiarare le proprietà, il costruttore e gli altri metodi della classe.

Proprietà della classe in PHP

Potreste pensare alle proprietà della classe come a delle variabili che vengono utilizzate per contenere le informazioni relative all'oggetto. Nell'esempio sopra, abbiamo definito tre proprietà first_name, last_name e age. Nella maggior parte dei casi, le proprietà della classe sono accessibili tramite oggetti istanziati.

Queste proprietà sono private, il che significa che sono accessibili solo dall'interno della classe. Questo è il livello di accesso più sicuro per le proprietà. Discuteremo i diversi livelli di accesso delle proprietà della classe e i metodi più avanti in questo articolo.

Costruttori per le classi PHP

Un costruttore è un metodo di classe speciale che viene chiamato automaticamente quando si crea un'istanza di un oggetto. Vedremo come creare istanze di oggetti nelle prossime due sezioni, ma per ora dovete solo sapere che un costruttore viene utilizzato per inizializzare le proprietà dell'oggetto quando viene creato l'oggetto.

Potete definire un costruttore definendo il metodo __construct.

Metodi per classi PHP

Possiamo pensare ai metodi della classe come a delle funzioni che eseguono azioni specifiche associate agli oggetti. Nella maggior parte dei casi, sono utilizzati per accedere e manipolare le proprietà dell'oggetto ed eseguire operazioni correlate.

Nell'esempio sopra, abbiamo definito il metodo getLastName, che restituisce il cognome associato all'oggetto.

Ecco una breve introduzione alla struttura di classe in PHP. Nella sezione successiva, vedremo come creare le istanze di oggetti della classe Employee.

Che cos'è un oggetto in PHP?

Nella sezione precedente, abbiamo discusso la struttura di base di una classe in PHP. Ora, quando volete utilizzare una classe, è necessario istanziarla e il risultato finale è un oggetto. Così potremmo pensare a una classe come a un progetto, e un oggetto è una cosa reale con cui potete lavorare.

Nel contesto della classe Employee che abbiamo appena creato nella sezione precedente, vediamo come creare un'istanza di un oggetto di quella classe.

È necessario utilizzare la parola chiave new quando volete creare un'istanza di un oggetto di qualsiasi classe con il suo nome di classe, e avrete indietro una nuova istanza dell'oggetto di tale classe.

Se una classe ha definito il metodo __construct e richiede degli argomenti, è necessario passare tali argomenti quando create un'istanza di un oggetto. Nel nostro caso, il costruttore della classe Employee richiede tre argomenti, e quindi li abbiamo passati quando abbiamo creato l'oggetto $objEmployee. Come abbiamo discusso in precedenza, il metodo __construct viene chiamato automaticamente quando viene creata un'istanza dell'oggetto.

Successivamente, abbiamo chiamato i metodi della classe dell'oggetto $objEmployee per stampare le informazioni che sono state inizializzate durante la creazione dell'oggetto. Naturalmente, potete creare più oggetti della stessa classe, come illustrato nel seguente frammento di codice.

L'immagine seguente è una rappresentazione grafica della classe Employee e alcune delle relative istanze.

Object Instantiation

In poche parole, una classe è un progetto che potete utilizzare per creare oggetti strutturati.

Incapsulamento

Nella sezione precedente, abbiamo discusso di come creare le istanze di oggetti della classe Employee. È interessante notare che l'oggetto di $objEmployee stesso avvolge insieme le proprietà e i metodi della classe. In altre parole, nasconde questi dettagli dal resto del programma. Nel mondo dell'OOP, questo si chiama incapsulamento dei dati.

L'incapsulamento è un aspetto importante dell'OOP che vi consente di limitare l'accesso a determinate proprietà o metodi dell'oggetto. E questo ci porta a un altro argomento di discussione: i livelli di accesso.

Livelli di accesso

Quando definite una proprietà o un metodo in una classe, potete dichiarare di avere uno di questi tre livelli di accesso public, private o protected.

Accesso pubblico

Quando dichiarate una proprietà o un metodo come pubblico, è possibile accedervi da qualsiasi luogo al di fuori della classe. Il valore di una proprietà pubblica può essere modificato ovunque nel codice.

Diamo un'occhiata a un esempio per capire il livello di accesso pubblico.

Come potete vedere nell'esempio precedente, abbiamo dichiarato che la proprietà name sia pubblica. Quindi, potete impostarla da qualsiasi punto all'esterno della classe, come abbiamo fatto qui.

Accesso privato

Quando dichiarate una proprietà o un metodo come private, si può accedere solo dall'interno della classe. Ciò significa che è necessario definire metodi get e set per ottenere e impostare il valore di tale proprietà.

Rivediamo, ancora una volta, l'esempio precedente per capire il livello di accesso privato.

Se tentate di accedere a una proprietà privata dall'esterno della classe, lancerà l'errore fatale Cannot access private property Person::$name. Pertanto, è necessario impostare il valore della proprietà privata utilizzando il metodo set, come abbiamo fatto utilizzando il metodo setName.

Ci sono delle buone ragioni per cui potreste voler rendere una proprietà privata. Per esempio, forse alcune azioni dovrebbero essere intraprese (aggiornare un database, diciamo, o ridefinizione di un modello) se tale proprietà viene modificata. In tal caso, potete definire un metodo set e gestire qualsiasi logica speciale quando la proprietà viene modificata.

Accesso protetto

Infine, quando dichiarate una proprietà o un metodo come protected, è possibile accedervi dalla stessa classe che l'ha definito e dalle classi che ereditano la classe in questione. Discuteremo l'ereditarietà nella prossima sezione, così torneremo al livello di accesso protetto più tardi.

Ereditarietà

L'ereditarietà è un aspetto importante del paradigma della programmazione orientata agli oggetti che vi consente di ereditare le proprietà e i metodi di altre classi, estendendole. La classe che viene ereditata è chiamata la classe genitore, e la classe che eredita l'altra classe è chiamata classe figlio. Quando create un'istanza di un oggetto della classe figlio, eredita pure le proprietà e i metodi della classe genitore.

Diamo un'occhiata al seguente screenshot per capire il concetto di ereditarietà.

Inheritance

Nell'esempio precedente, la classe Person è la classe genitore, e la classe Employee estende o eredita la classe di Person e così viene chiamata classe figlio.

Proviamo a passare attraverso un esempio concreto per capire come funziona.

La cosa importante da notare qui è che la classe Employee ha utilizzato la parola chiave extends per ereditare la classe Person. Ora, la classe Employee può accedere a tutte le proprietà e ai metodi della classe Person che vengono dichiarati come public o protected. (Non è possibile accedere ai membri che sono dichiarati come private.)

Nell'esempio precedente, l'oggetto $employee può accedere ai metodi getName e setName che sono definiti nella classe Person poiché vengono dichiarati come public.

Successivamente, abbiamo avuto accesso al metodo callToProtectedNameAndAge utilizzando il metodo getNameAndAge definito nella classe Employee, dato che è dichiarato come protetto. Infine, l'oggetto $employee non può accedere al metodo callToPrivateNameAndAge della classe Person poiché è dichiarato come privato.

D'altra parte, potete utilizzare l'oggetto $employee per impostare la proprietà age della classe Person, come abbiamo fatto nel metodo setAge, che è definito nella classe Employee, poiché la proprietà age è dichiarata come protetto.

Quindi questa era una breve introduzione all'ereditarietà. Vi aiuta a ridurre la duplicazione del codice e incoraggia quindi la riusabilità del codice.

Polimorfismo

Il polimorfismo è un altro concetto importante nel mondo della programmazione orientata agli oggetti che si riferisce alla possibilità di elaborare gli oggetti in modo diverso a seconda del loro tipo di dati.

Per esempio, nel contesto dell'ereditarietà, se la classe figlio vuole cambiare il comportamento del metodo della classe genitore, può ignorare tale metodo. Questo è chiamato il metodo overriding. Vediamo subito un esempio concreto per capire il concetto di metodo overriding.

Come potete vedere, abbiamo cambiato il comportamento del metodo formatMessage eseguendo l'override della classe BoldMessage. La cosa importante è che un messaggio è formattato in modo diverso a seconda del tipo di oggetto, che si tratti di un'istanza della classe genitore o il figlio.

(Alcuni linguaggi orientati agli oggetti hanno anche una sorta di overload del metodo che consente di definire più metodi di classe con lo stesso nome ma un numero diverso di argomenti. Questo non è direttamente supportato in PHP, ma ci sono un paio di soluzioni alternative per ottenere funzionalità simili.)

Conclusione

La programmazione orientata agli oggetti è un argomento molto vasto, e abbiamo solo scalfito la superficie della sua complessità. Spero che questo tutorial vi ha aiutato a iniziare con le basi dell'OOP e che vi ha motivato a proseguire e imparare argomenti più avanzati dell'OOP.

La programmazione orientata agli oggetti è un aspetto importante nello sviluppo di applicazioni, indipendentemente dalla tecnologia con cui si sta lavorando. Oggi, nel contesto di PHP, abbiamo discusso un paio di concetti di base dell'OOP, e abbiamo anche colto l'occasione per introdurre alcuni esempi concreti.

Sentitevi liberi di inviare le vostre domande utilizzando il feed qui sotto!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.