# data[].attributes.body
l’Astrazione dei Dati viene utilizzata per gestire al meglio la complessità di un programma, ovvero viene applicata per decomporre sistemi software complessi in componenti più piccoli e semplici che possono essere gestiti con maggiore facilità ed efficienza.

# data[].attributes.body
La programmazione orientata agli oggetti (Object Oriented Programming) è uno stile di programmazione che si basa principalmente sul raggruppamento all'interno di un'unica entità (la classe) delle strutture dati e delle procedure che operano su di esse.

# data[].attributes.body
Gli oggetti rappresentano le entità del problema in grado di memorizzare le informazioni

che riguardano il suo stato; è anche possibile associare

ad un oggetto un insieme di operazioni che esso può compiere.
Ogni oggetto ha una propria identità ben distinta.

# data[].attributes.body
Più oggetti software che hanno le stesse proprietà e gli stessi metodi ,possono essere raggruppati in una classe ben definita di oggetti.Dunque, una classe rappresenta, sostanzialmente, una categoria particolare di oggetti.Un particolare oggetto che appartiene ad una classe costituisce un’istanza della classe stessa

# data[].attributes.body
+stato, l’insieme delle variabili interne che ne definiscono le caratteristiche in un certo istante dell’esecuzione;

+Gli attributi rappresentano gli elementi che caratterizzano l’oggetto, utili per descrivere le sue caratteristiche e definirne

il suo stato.
+I metodi rappresentano i comportamenti e le funzionalità

che l’oggetto mette a disposizione

# data[].attributes.body
Principali vantaggi della oop:

•facilità di lettura e di comprensione del codice;

•manutenzione del programma;

•robustezza del programma;

riusabilità di parti di codice

# data[].attributes.attachment_link.readable_text
Probabilmente, il termine più importante e rappresentativo nella Programmazione ad Oggetti è quello di Classe.

Riprendiamo ancora l'esempio del masterizzatore. Sappiamo benissimo che non esiste un solo tipo di masterizzatore ma, a secondo delle caratteristiche, è possibile citarne tanti modelli: ci sono, ad esempio, quelli in grado di scrivere su CD e DVD o quelli che scrivono solo su CD.

Sicuramente, però, tutti sono in grado di eseguire la scrittura di dati o file multimediali su CD e tutti hanno, altresì, le proprietà esposte nelle lezioni precedenti.

Diremo allora che più oggetti software che hanno le stesse proprietà e gli stessi metodi possono essere raggruppati in una classe ben definita di oggetti: nel nostro caso particolare, nella classe masterizzatore.

Dunque, una classe rappresenta, sostanzialmente, una categoria particolare di oggetti e, dal punto di vista della programmazione, è anche possibile affermare che una classe funge da tipo per un determinato oggetto ad essa appartenente (dove con tipo si intende il tipo di dato, come lo sono gli interi o le stringhe).

Diremo, inoltre, che un particolare oggetto che appartiene ad una classe costituisce un' istanza della classe stessa. In altre parole, un'istanza della classe masterizzatore sarà costituita da un oggetto di tale classe che è in grado di scrivere solo su CD mentre un'altra istanza potrà essere rappresentata da un oggetto che è in grado di masterizzare anche i DVD.

È anche possibile creare due o più istanze separate di oggetti uguali (sarebbe meglio dire di oggetti che hanno le proprietà valorizzate allo stesso modo) ma ciò non vorrà dire che in un determinato istante nel corso del programma tutte queste istanze eseguano la medesima operazione o che, in generale, siano necessariamente correlati.

L'univocità di ogni istanza viene definita con il termine di identità (identity): ogni oggetto ha una propria identità ben distinta da quella di tutte le altre possibili istanze della stessa classe a cui appartiene l'oggetto stesso.

Naturalmente, le proprietà di un oggetto possono avere valori che variano nel tempo. Ad esempio, la velocità di scrittura potrebbe essere selezionata dall'utente e, pertanto, potrebbe variare nel corso del programma. Si definisce stato di un oggetto, l'insieme dei valori delle sue proprietà in un determinato istante di tempo. Se cambia anche una sola proprietà di un oggetto, il suo stato varierà di conseguenza.

L'insieme dei metodi che un oggetto è in grado di eseguire viene definito, invece, comportamento (behavior). Insomma, appare sempre più chiaro come un oggetto rappresenti un'entità a sé stante, ben definita che, nel corso dell'elaborazione, sia soggetta ad una creazione, ad un suo utilizzo e, infine, alla sua distruzione.

Inoltre, un oggetto non dovrebbe mai manipolare direttamente i dati interni (le proprietà) di un altro oggetto ma ogni tipo di comunicazione tra oggetti dovrebbe essere sempre gestita tramite l' uso di messaggi, ovvero tramite le chiamate ai metodi che un oggetto espone all'esterno.

# data[].attributes.attachment_link.description
Probabilmente, il termine più importante e rappresentativo nella Programmazione ad Oggetti è quello di Classe. Riprendiamo ancora l'esempio del masterizzatore. Sappiamo benissimo che non esiste un solo tipo di masterizzatore ma, a secondo delle caratteristiche, è possibile citarne tanti modelli: ci sono, ad esempio, quelli in grado di scrivere su CD e DVD o quelli che scrivono solo su CD.

# data[].attributes.attachment_link.readable_text
La programmazione orientata agli oggetti (Object Oriented Programming, da cui l'acronimo OOP) è uno stile fondamentale di programmazione (o paradigma) che si basa principalmente sul raggruppamento all'interno di un'unica entità (la classe) delle strutture dati e delle procedure che operano su di esse.

Istanziando la classe, che rappresenta fondamentalmente una struttura astratta, è possibile creare "oggetti" concreti (le cosiddette istanze) dotati di proprietà (dati/variabili) e metodi (procedure/funzioni) che operano sui dati dell'oggetto stesso.

Per quanto complessa possa essere questa definizione, potete rassicurarvi sapendo che quest'ultima racchiude la maggior parte dei concetti fondamentali della OOP.

OOP e PHP

Prima della nascita della versione 5, PHP era un linguaggio sostanzialmente procedurale, ovvero fortemente basato sulle funzioni, interne o user-defined. Nonostante fosse dotato di un singolare modello ad oggetti, questo non poteva assolutamente essere considerato completo e non permetteva di mettere in pratica i veri concetti della programmazione OOP. Di conseguenza, il vecchio modello non consentiva di usufruire di tutti i vantaggi di questo paradigma.

Con il rilascio della versione 5, le cose sono decisamente cambiate. Ora PHP dispone di un solido modello OOP completo di tutti i più importanti strumenti che questo offre. Dunque, anche se PHP continua a non essere un linguaggio nativamente orientato agli oggetti (come ad esempio Java o altri), permette ora di realizzare solide applicazioni OOP.

I vantaggi del modello ad oggetti

Nel mio precedente articolo denominato Codice procedurale vs OOP sono ben elencati tutti i vantaggi derivanti dall'utilizzo e dalla padronanza del modello ad oggetti (compresi, ovviamente, gli eventuali svantaggi) con tanto di dettagliate descrizioni e confronti con il modello procedurale. Riporto qui solo i principali benefici che lo sviluppatore PHP trae adottando una struttura OOP:

presenza di regole precise da seguire

migliore qualità dello sviluppo di applicazioni realizzate in team

modularità dell'applicazione

manutenibilità del progetto

estensibilità dell'applicazione

possibilità di usufruire dei design patterns

possibilità di usufruire dei principali web services

presenza di nuovi costrutti

In sostanza, oltre a garantire maggiore modularità ed estensibilità rispetto alla controparte procedurale, il modello ad oggetti consente di sviluppare applicazioni PHP di nuova generazione usufruendo degli strumenti ( web services) e delle modalità logiche ( design patterns) utili alla loro nascita.

Scopo ed obiettivi della guida

Come ho precedentemente dichiarato nell' articolo Codice procedurale vs OOP (e come ripasseremo nella prossima lezione), realizzare applicazioni usufruendo del modello ad oggetti è decisamente più complesso rispetto al modello procedurale. Questo perché le teorie che stanno alla base di questo paradigma sono molte e parecchio articolate, così come è elevata la quantità di gli strumenti che ci vengono forniti.

Questa guida ha appunto lo scopo di trasmettere questi concetti, o meglio, tutti i concetti fondamentali della programmazione ad oggetti in PHP e consentire allo sviluppatore di realizzare applicazioni object oriented con il linguaggio PHP. La guida sarà sostanzialmente divisa in due parti:

una parte teorica dove si studieranno i concetti, le teorie, i namespaces ed il funzionamento fondamentale della OOP

una parte pratica finale dove affronteremo lo sviluppo di una applicazione OOP completa in PHP

Nonostante percorra dettagliatamente i concetti di base della OOP e sia destinata principalmente ad un utenza di principianti, questa guida è scritta in modo che ogni categoria di sviluppatore PHP (principiante, intermedio ed esperto) possa trarre vantaggio dalla lettura.

# data[].attributes.attachment_link.description
La programmazione orientata agli oggetti (Object Oriented Programming, da cui l'acronimo OOP) è uno stile fondamentale di programmazione (o paradigma) che si basa principalmente sul raggruppamento all'interno di un'unica entità (la classe) delle strutture dati e delle procedure che operano su di esse.