In generale, viene considerata buona pratica tenere private le variabili di classe, come nel primo esempio, e fornire dei metodi di accesso (i cosiddetti "getter" e "setter").
Il motivo di ciò è che in questo modo si mantiene il controllo su ciò che viene impostato nei campi.
Immagina di avere un campo numerico che, per motivi di logica della classe, deve avere un valore compreso fra 1 e 10. Se il campo è pubblico, chiunque usi quella classe può fare
$oggetto->campo = 11
stravolgendo la logica di base.
Se invece il campo è privato e hai un metodo setter di questo tipo
non avrai mai un valore incongruente in quel campo.Codice PHP:
function setCampo($val) {
$this->campo = $val;
if ($this->campo < 1) $this->campo = 1;
if ($this->campo > 10) $this->campo = 10;
}
Questo è un esempio banale, potresti anche gestire un sistema di notifica di eventuali valori non validi passati, ad esempio lanciando eccezioni, o prevedere che un valore non valido lascia immutato il valore precedente, invece di impostare il valore limite come ho fatto io. Insomma puoi fare quello che ti pare![]()
Il codice del primo esempio che hai postato si ispira a questa filosofia, anche se per impostare i valori utilizza il costruttore e non metodi setter. In questo caso la cosa può essere giustificata, ad esempio, considerando che il nome di una persona è immutabile. Ma in un'ottica più generica, quel codice ha il difetto di non consentire la modifica dei valori dopo la creazione dell'oggetto.