Solo una semplice domanda. Ho visto molti casi in cui il codice viene implementato come il seguente:OOP - utilizzo di proprietà private e public getter
class User
{
private $id;
private $firstname;
private $lastname;
public function __construct() { some code }
public function getId() { return $this->id; }
public function getFirstname() { return $this->firstname; }
public function setFirstname($value) { $this->firstname = $value; }
}
// And properties are accessed like:
$user->getFirstname();
$user->getId();
Allora, qual è la ragione di usare le proprietà private e avere getter pubblici, invece di fare le proprietà pubbliche e l'accesso diretto come:
$user->firstname;
PS: Va bene se utilizzo il secondo metodo?
EDIT
Sembra che io non ho ricerca ben prima di questa domanda (immagino che ho usato tasti sbagliati per cercare l'argomento). Ecco un'altra buona risposta alla (quasi) stessa domanda: https://stackoverflow.com/a/1568230/1075534
Fondamentalmente, per il mio caso, una buona ragione per usare getter e setter è evitare di cambiare 250 classi che accedono direttamente alla proprietà. Così, per esempio, immaginare che non stavo usando un getter:
class User
{
public $firstname = 'abc';
public $lastname = 'cde';
}
$user = new User();
echo $user->firstname . ' ' . $user->lastname;
Ora, immagino che voglio cambiare il comportamento della mia app e decido di stampare nomi capitalizzati. In questo caso, quindi, cercherei ogni implementazione (250 in questo caso :) e capitalizzerò l'output ovunque avessi chiamato le proprietà. Ma, piuttosto se ho usato un getter poi vorrei solo cambiare il metodo getter:
class User
{
private $firstname = 'abc';
private $lastname = 'def';
public getFirstname()
{
return ucfirst(strtolower($this->firstname));
}
public getLastname()
{
return ucfirst(strtolower($this->lastname));
}
}
Inoltre, tenere a mente che un getter potrebbe non solo raccogliere informazioni da una singola proprietà. Immaginate la seguente:
class User
{
private $firstname = 'abc';
private $lastname = 'def';
public function getName()
{
return $this->firstname . ' ' . $this->lastname;
}
}
Per coloro che hanno ancora domande su questo argomento, suggerisco loro lettura del materiale che Gordon fornito e soprattutto la risposta che ho linkato.
Si consiglia di leggere codice completo 2. Ha un grande spiegazione su questo argomento e altri concetti di sviluppo del software. – Gohn67