Una Classe PHP Principale per tutte le tue classi! (organizzazione)

SPIEGAZIONE RAPIDA

Utile per framework o librerie personalizzate.
Quando crei tante classi puoi tenerle tutte sono uno stesso nome:

$main->classe->funzione()
//esempio:
$mioFramework->accessi->logout()

così sarà tutto molto più pulito.

FINE SPIEGAZIONE RAPIDA

Oggi sto per creare il mio secondo framework, questa volta in inglese e con un brillante futuro davanti.

Stavo però impazzendo poiché volevo fosse tutto chiaro e semplice da leggere, a differenza di altri framework che creano un nome di classe differente per ogni utilizzo, e questo porta a dimenticarsi dei pezzi (New-Framework era così e senza costante documentazione alla mano non c’era modo di ricordarsi tutto… $Ndb $Nredirect $Nsessioni…).

Ho trovato una soluzione, direi LA soluzione.
Quanto segue è una traccia, potete cambiare i nomi ma solo se sapete poi come modificare il resto.

Creiamo una cartella “lib” nella cartella principale del sito.
All’interno di “/lib” creiamo TUTTI i file con le classi che vogliamo disponibili tramite $main.
Qui metto una parentesi. Ci sono tanti framework con nomi di classe semplici e potrebbero andare in contrasto con il nostro. Come risolviamo?
Aggiungiamo un prefisso al nome della classe, ad esempio MF (per MioFramework, es. db.php avrà la classe MFdb).

Tornando a noi: un file per classe, molto ordinato!

Ora creiamo un file nella root principale, chiamiamolo “main.php” (sarà lui a creare la magia) e inseriamo questo codice:

<?
class main {
	
	public function __construct(){
		if(count(func_get_args())>0){
			foreach (func_get_args() as $param) {
		        $files[] = $param.".php";
		    }
		}else{
			$files = scandir(__DIR__.'/lib/');
		}

		foreach($files as $file) {
	   		if($file!="."&&$file!=".."){
		   		$file2 = str_replace(".php", "", $file);
		   		$file3 = "MF".$file2;
		   		require(__DIR__."/lib/".$file);
		   		$this->{$file2} = new $file3();
		   	}	
	   	}
	}	
}

Cosa succede? Creiamo una classe “main” e un costruttore che, per chi non lo sapesse, viene chiamato anche solo creando una nuova istanza di main (es. $main = new main(); ) che per noi è perfetto visto che non ci serve ad altro.
In riga 5 contiamo i parametri passati (si lo so non ce ne sono tra le parentesi della funzione __construct() e infatti con questo sistema possiamo passarne infiniti!) e per ogni parametro si carica una specifica classe, così non carichiamo l’intera cartella lib se non è necessario. Se invece non ci sono parametri (new main();) verrà caricata in automatico ogni classe nella libreria (linea 10, molto comodo).

In linea 13 un bel foreach ci fa il loop di tutte le classi e crea una variabile di classe ( $main->var; ) che conterrà la nostra classe! La includerà nel progetto e sarà così disponibile a tutta la pagina caricata.

In linea 16 togliamo l’estensione dal nome classe, ci servirà per il nome della nostra variabile di classe ($main->db per il file db.php).

In linea 17 aggiungiamo MF al nome della classe da creare, perché nel file db.php noi avremo la classe MFdb.php (per il discorso della compatibilità).

In linea 18 carichiamo il file e in linea 19 settiamo la variabile di classe con assegnata la nostra classe.

SVANTAGGI: penso nessuno, caricare tutte le classi pesa al server ma se si ha bisogno di molti strumenti utili è necessario o diventa un calvario ogni volta.

VANTAGGI: si ha un sistema chiaro e rapido per accedere ad ogni classe, esempi?

$main->db->connetti("root","password","localhost","tabellaUtenti"); //e ci si connette al database
$main->accessi->login($email,$password); //e ritorna vero o falso se i dati nel database corrispondono
$main->variabili->post("testo"); //e recuperiamo da un form inviato tramite post il campo testo

Le possibilità sono INFINITE!

Ricapitolando:

PERCORSO FILE

main.php     //con il codice postato sopra
/lib         //conterrà TUTTE le nostre classi!
- db.php     //class MFdb {}

TUTTO QUI!
Ah dimenticavo! Settiamo la classe main su una variabile:

$main = new main();

Se vogliamo caricare solo delle classi:

$main = new main("db","accessi","variabili"); //si salva memoria ma va messo tutto a mano

E non è finita, le classi sono accessibili anche con:

MFdb::connetti() //ecco perché abbiamo aggiunto MF al nome della classe!
MFaccessi::login()

e via dicendo.

Un ultima cosa. Se come me avete problemi nel trovare la variabile $main (anche se settata nel file main.php), possiamo creare una variabile Globale, così sarà accessibile tramite $main da OGNI parte del sito, classi e funzioni comprese!

$GLOBALS["main"] = new main();
// ora $main sarà visibile OVUNQUE!

Non è una cosa semplicissima ma per le sue potenzialità è una passeggiata!

Buon Coding!

Annunci

, , , , , , , , , , , , , ,

  1. Lascia un commento

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: