Corso di PHP

Oggetti III

 

Come già detto nelle puntate precedenti una classe è una collezioni di variabili e di metodi che lavorano con queste variabili.
Diamo di seguito un esempio di definizione di classe:

<?php
class Carrello
{
var $articoli;

function add_art ($artnr, $num)
{
$this->articoli[$artnr] += $num;
}

function remove_art ($artnr, $num)
{
if ($this->articoli[$artnr] > $num)
{
$this->articoli[$artnr] = $num;
return true;
}
else
{
return false;
}
}
}
?>

Abbiamo definito in questo modo una classe Carrello che vorrebbe implementare appunto un carrello per la spesa. Essa consiste di un attributo $articoli e due metodi add_art e remove_art. L’attributo articoli è un array associativo contenente il numero degli articoli di un determinato tipo presenti nel carrello.

Notiamo che gli attributi sono individuati dalla parola chiave var mentre i metodi sono indicati come function.

I metodi presentano, di seguito al nome e tra parentesi tonde la lista dei parametri formali, mentre il corpo del metodo (ossia il codice che implementano) è racchiuso tra parentesi graffe. Una funzione può ritornare un valore tramite l’operatore return.
All’interno di una funzione la variabile $this significa che si fa riferimento all’oggetto corrente.

Come sappiamo le classi sono tipi; rappresentano quindi il modello per una variabile attuale, l’oggetto. Per creare un oggetto di una determinata classe si usa l’operatore new.

L’istruzione seguente

$Miocarrello = new Carrello;

crea un oggetto chiamato $Miocarrello dalla classe Carrello.
Per riferirsi ad un attributo o ad un metodo di un oggetto si usa l’operatore “->”.
Per esempio l’istruzione

$Miocarrello->add_art(10,1);

aggiunge un articolo al carrello $Miocarrello chiamando il metodo add_art e passando i parametri attuali scelti.

Attenzione:
Dopo l’operatore “->” non si usa mai il simbolo $ per riferirsi ad un attributo.

Abbiamo detto che una classe può essere estensione di un’altra classe. La classe estesa o derivata ha tutti gli attributi e tutti i metodi della classe genitore più quelli definiti nella dichiarazione di estensione.

Attenzione: A beneficio degli utenti di C++ diciamo subito che non è consentita l’ereditarietà multipla.

Vediamo adesso come estendere una classe facendo uso di un esempio:

class Carrello_etichettato extends Carrello
{
var $etichetta;

function set_etichetta ($nome)
{
$this->etichetta = $nome;
}
}

La classe Carrello_etichettato estende la classe Carrello tramite la parola chiave extends; dopo la dichiarazione d’estensione segue, tra parentesi graffe, la lista dei nuovi attributi e l’implementazione dei nuovi metodi. Nel nostro caso abbiamo aggiunto un attributo $etichetta per contenere il nome del proprietario e il metodo set_etichetta per scrivere su di essa. Su un oggetto di questa nuova classe possiamo ancora usare tutti i metodi della classe carrello ed accedere agli attributi definiti nella superclasse.

Per ogni classe esiste un metodo speciale: il cosiddetto metodo costruttore. I metodi costruttori sono delle funzioni che sono chiamate automaticamente quando viene creato un nuovo oggetto. Quando si definisce una classe il metodo costruttore viene creato automaticamente e setta ai valori di default tutti gli attributi della classe.
Per creare un metodo costruttore basta scrivere una funzione che abbia lo stesso nome della classe di appartenenza. Utilizzare un metodo costruttore può essere utile per inizializzare alcuni degli attributi degli oggetti, anche in considerazione del fatto che una classe PHP non può contenere costanti ma solo variabili. I costruttori possono anche accettare argomenti e questi argomenti possono essere anche opzionali. Ciò li rende ancor più utili.

Per il nostro carrello etichettato possiamo, per esempio, definire il costruttore seguente:

function Carrello_etichettato ($nome = ”Sandro”)
{
$this->etichetta = $nome;
}

In questo caso l’istruzione:

$Miocarello = new Carrello_etichettato;

assegnerà all’attributo $etichetta il valore di default “Sandro”, mentre l’istruzione

$Miocarello = new Carrello_etichettato(“Luca”);

setterà lo stesso attributo con il valore “Luca”.

Attenzione:
per le classi derivate il costruttore delle super classi non viene chiamato automaticamente.

Con quanto appena detto abbiamo concluso la trattazione degli oggetti PHP, dimostrando ancora una volta quanto questo linguaggio si mostri facile ed intuitivo.

Con la prossima lezione concluderemo la trattazione sui tipi di dato analizzando i meccanismi per la loro manipolazione.

 

Torna all'indice Generale del corso di Corso di PHP di Software Planet