Setter/Getter, Visibilità [OOP] in PHP
-
18-09-2019 - |
Domanda
Sto riformattando la mia classe (vedi sotto): penso di aver commesso l'errore di impostare tutto con la stessa visibilità nella mia classe, mentre le proprietà dovrebbero in realtà essere private e getter/setter dovrebbero essere pubbliche nella maggior parte dei casi.
Per acquisire una proprietà faccio semplicemente $path->propertyname ma ho notato che è più pratico avere setter/getter.Se dovessi implementare i getter, dovrei crearne uno per ogni proprietà o posso crearne uno per l'intera classe?Quindi, ad esempio, dì che voglio ottenere il nome del controller...
public function getController( ) {
return $this->controller;
}
E questo restituirebbe al controllore la proprietà privata?È comune avere un getter/setter più generico o anche un metodo ibrido che ottiene E set per me?
Ecco la struttura della classe (solo proprietà/metodi):
class urlParser {
public static $url = '';
public static $controller = '';
public static $baseController = '';
public static $urls = '';
public static $template = '';
public static $captures = '';
public static $contentXML = '';
function __construct( $urls ) {
$this->urls = $urls;
$this->baseController = $urls['default'];
$this->get_url();
}
public function get_url() {
// sets following properties:
// url, template, controller, contentXML, baseController
}
}
Soluzione
Avere setter e getter in voi caso è inutile.
Nel caso in cui si deve fare nulla oltre il ritorno del controller, non è necessario getter come non hai bisogno di setter se non fai niente con la proprietà dopo che è stato impostato.
Nel caso in cui si vuole veramente getter e setter, è possibile utilizzare __get e __set metodi magici per tutte le proprietà. Ma questo è del tutto inutile se il caso è, come ho descritto sopra.
Altri suggerimenti
dare un'occhiata al sovraccarico in php: http://php.net/overload
ci sono due metodi di magia __get()
e __set()
che potrebbero fare esattamente quello che vuoi
Gli oggetti PHP ne hanno alcuni carini metodi magici (anche se non li uso tutti perché può creare confusione).Quello che potresti cercare è __Ottenere() E __impostato().Dovresti comunque rifattorizzare tutto il tuo codice se scegli di rendere privati i tuoi campi dati (cosa che dovresti fare in modo da non avere l'altro codice che accede ai campi in modo errato.Farlo in questo modo aiuta a rendere il tuo codice un po' migliore e più facile da mantenere.
Tuttavia, di solito cerco di avere getter e setter per ogni campo di dati privati perché puoi facilmente vedere qualsiasi convalida per ciascun campo.Inoltre sono più uno sviluppatore Java che uno sviluppatore PHP.