30 Oct 2013 0 commenti
Codeigniter è un framework sviluppato sin dai tempi di php4 e per lungo tempo ha mantenuto la compatibilità con questo: solo dopo il rilascio della versione 2.0 che ha abbandonato la compatibilità con php4.
Fra le tante novità che php5 ci mette a disposizione disponiamo di tre indicatori di visibilità, ovvero public, protected e private, che possiamo attribuire a proprietà e metodi a seconda del tipo di impiego che questi avranno nel nostro applicativo. In maniera sintetica possiamo dire che:
- Metodi private: possono essere impiegati solo all'interno della classe;
- Metodi protected: possono essere impiegati all'interno della classe e in quelle ereditate classi (extends);
- Metodi public: è accessibile sia nella classe, sia in quelle ereditate sia all'esterno della classe.
Non mi dilungo ulteriormente perchè non è lo scopo di questo articolo.
E' ovvio che le funzionalità di tali strumenti con php5 sono validissime anche in CodeIgniter. Ma come agiscono sul funzionamento di Codeigniter? Come devono essere impiegati i diversi indicatori di visibilità?
La risposta non è per nulla semplice ed immediata e ritengo che la stessa guida ufficiale di CodeIgniter non tratti tale argomento in modo adeguato. Vi illustrerò, quindi, il mio modo di operare in base alla mia personale esperienza; a maggior ragione invito i più esperti a lasciami il loro feedback.
Metodi privati in CodeIgniter prima e dopo di Php5
Spessissimo si ha la necessità, per svariate ragioni, di avere model o controller con metodi non accessibili dall'"esterno". Ai tempi di php4, data l'assenza degli indicatori di visibilità che consentono una programmazione OOP rigorosa, CodeIgniter per includere alcune di queste funzionalità faceva ricorso ad una convenzione che risulta ancora oggi valida. In particolare, CodeIgniter per implementare i metodi "privati" ha da sempre, anche prima di php5, l'aggiunta del suffisso underscore _ al nome del metodo, tecnica oltre che valida in alcuni casi necassaria ancora oggi.
Vediamolo in pratica analizzando sepratatamente la questione dei metodi privati all'internode dei Model e all'interno dei Controller.
Indicatori di visibilità nei model
Nei Model la questione, se si ha ben chiaro il funzionamento dei diversi indicatori di visibilità di php5, si presenta semplice ed intuitiva. Se un metodo all'interno del model deve essere accessibile all'interno dei controller che eseguono il load di tale model allora il metodo dovrà essere public e senza il prefisso con underscore.
Se, invece, si vuole impedire l'esecuzione di un metodo del model all'esterno, tipicamente nel controller ma volendo anche nelle view, il metodò dovrà avere il prefisso l'underscore ed, solo eventualmente, essere private o protected (questi si equivalgono in questo ambito dato che non sarà possibile, salvo hack particolari, ereditare un model).
Indicatori di visibilità nei controller
Il problema lo si pone soprattutto per l'esigenza di creare metodi all'interno dei controller che non siano accessibili tramite URL. Infatti, come illustrato in articoli precedenti, nell'ambito di un framework che segue la logica MVC ciascun metodo del controller può essere invocato per mezzo del secondo segmento dell'URL:
/NOME_CONTROLLER/NOME_METODO/PARAMETRO_METODO
La questione in questo caso, essendo più complessa, la affrontiamo partendo con uno stupido esempio. Analizziamo un controller in cui sono presenti le tre metodi con tre indicatori di visibilità:
Class Example extends CI_Controller{ // Metodo private private function exampleA(){ echo 'This is a private method'; } // Metodo protected protected function exampleB(){ echo 'This is a protected method'; } // Metodo public: unico ad essere eseguibile tramite URL public function exampleC(){ echo 'This is a public method'; } }
L'unico dei tre metodi ad essere eseguibile tramite URL è quello con indicatore di visibilità public.
Da questo punto di vista, l'accessibilità di un metodo di un controller tramite URL, abbiamo ottenuto con private e public lo stesso risultato che si otterrebbe mettendo il underscore al nome del metodo.
Ma vediamo un ulteriore esempio:
Class Welcome extends CI_Controller{ // metodo "privato" con visibilità public public function _utility(){ // code here } // metodo "privato" con visibilità protected protected function _utility2(){ // code here } // metodo "privato" con visibilità private private function _utility3(){ // code here } }
Puntando su /welcome/_utility o /welcome/_utility2 o /welcome/_utility3 ci verrà restituito sempre errore 404 (Not found).
Quindi, il prefisso _ underscore attribuito al nome dei metodi impedisce che il metodo sia eseguito per mezzo dell'URL, a prescindere dall'indicatore di visibilità che gli è stato attribuito.
Allora ci si pone una domanda: quale tecnica tecnica impiegare per i metodi che si desiderano non accessibili tramite URL? Si deve utilizzare il prefisso unserscore o è sufficiente l'indicazione private/protected attrivbuita al metodo? I metodi con il prefisso underscore quale indicatore di visibilità devono avere?
Una risposta ufficiale non l'ho trovata (almeno fino ad ora) e quindi vi dico come opero io.
Per questi metodi "privati" attraverso l'underscore, per una questione di coerenza, è bene utilizzare l'indicatore di visibilità private, ma con due importantissime eccezioni:
- I metodi callback sviluppati per la form validation class dovranno essere public;
- I metodi presenti nel particolare file MY_Controller dato che potranno essere utilizzati nelle classi ereditarie dovranno essere protected.
Proprio questi due argomenti saranno oggetto dei prossimi articoli dedicati a CodeIgniter.
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.