Come abbiamo imparato dalla precedente lezione, le classi possono condividere le proprie funzionalità (costanti, proprietà e metodi) con le classi eredi. Questo è possibile perché tutte le proprietà ed i metodi utilizzati nelle classi che abbiamo analizzato sono stati dichiarati con la keyword public
. Ciò significa, che essi sono disponibili pubblicamente, ovvero in ogni parte dello script: all'interno della classe stessa, all'esterno ed all'interno delle classi che ereditano.
Ma questa flessibilità può essere troppo fuorviante ed in alcuni casi dannosa, senza contare che la sola keyword public
non permette la realizzazione di parecchi Design Patterns. Per questo motivo, esistono altri due indicatori di visibilità: protected
e private
. Ecco le descrizioni di tutti gli indicatori che abbiamo a disposizione:
- public: la proprietà o il metodo dichiarato come
public
è rispettivamente accessibile/ modificabile e richiamabile dall'interno della classe stessa, dall'esterno della classe e dall'interno delle classi che ereditano. - protected: la proprietà o il metodo dichiarato come
protected
è rispettivamente accessibile/modificabile e richiamabile dall'interno della classe stessa e dall'interno delle classi che ereditano, ma non è accessibile dall'esterno della classe - private: la proprietà o il metodo dichiarato come
private
è rispettivamente accessibile/ modificabile e richiamabile unicamente dall'interno della classe stessa
Vediamo ora degli esempi pratici che ci aiuteranno a capire le differenze che si ottengono dal comportamento di proprietà e metodi quando vengono dichiarati con uno specifico indicatore di visibilità.
Public
L'indicatore di visibilità public
è il più semplice ed immediato dei tre. Dichiarando un elemento come public
, si avrà il controllo completo sullo stesso in ogni situazione:
class MyClass {
const A = 10;
// proprietà
public $a = 10;
// metodi
public function sayHello() {
echo "Hello!";
}
}
class AnotherClass extends MyClass {
// proprietà
public $b = 10;
}
$myClass = new MyClass();
// stampa (10)
echo $myClass->a;
// modifica
$myClass->a = 20;
// chiamata ("Hello!")
$myClass->sayHello();
$anotherClass = new AnotherClass();
// stampa (10)
$anotherClass->a;
// chiamata ("Hello!")
$anotherClass->sayHello();
Ricordiamo inoltre, che le costanti dichiarate all'interno di una classe sono sempre considerate pubbliche e quindi accessibili da qualsiasi posizione.