Web Analytics Made Easy - Statcounter


https://www.amazon.it/dp/B0CT9YL557

We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
a2 --- Classi e oggetti

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 262.   Classi e oggetti

Uno dei grandi vantaggi del PHP è la possibilità di scrivere codice orientato agli oggetti. Le classi sono particolari strutture che possono contenere al loro interno variabili e funzioni dette metodi. Una volta definita la classe è possibile definire uno o più oggetti del tipo classe, in questo modo gli oggetti, le variabili in essi contenute e i metodi saranno tutti indipendenti tra loro.

Ad esempio si immagini una classe rubrica che al suo interno contiene i metodi aggiungi(), cerca() e rimuovi(), per manipolare i dati in archivio basterà definire un oggetto di tipo rubrica, tutto il necessario sarà contenuto all'interno dell'oggetto, ovvero le procedure di inserimento, ricerca e cancellazione, lo sviluppatore dovrà solo fornire i parametri richiesti dai metodi.

Spesso è comodo usare all'interno di una classe metodi di un'altra classe, in PHP è possibile definire una classe come estensione di un'altra già esistente. Questo consente di risparmiare tempo e lavoro, inoltre rende il codice pulito e leggibile.

Si potrebbe avere la necessità di effettuare un confronto tra due voci in rubrica. Una soluzione è l'aggiunta di un metodo, un'altra è estendere la classe. La scelta non è sempre scontata, in questo caso la strada più semplice è la scrittura di un nuovo metodo confronta() ma spesso risulta conveniente creare una classe centrale che contiene i metodi fondamentali e comuni e varie classi satellite, estensioni di quella centrale, contenenti i metodi usati più di rado.

262.1   Definizione di classi e oggetti

Prima di approfondire il concetto di "oggetto" con degli esempi pratici è bene introdurre la sintassi PHP che permette di manipolarli.

Come più volte ripetuto un oggetto è un istanza ad una classe, dunque la struttura della classe deve essere definita prima della dichiarazione dell'oggetto.

La sintassi di definizione di una classe è la seguente:

  class nome_classe{

    var variabili_comuni_alla_classe ;

    function nome_classe(parametro1="valore_di_default1", ...){
        .
        . 
        .
    } 

    function nome_metodo1(parametro1, parametro2, ...){
        .
        . 
        .
    }

    function nome_metodo2(parametro1, parametro2, ...){
        .
        . 
        .
    }

  }

L'istruzione class segnala l'inizio della dichiarazione della classe, segue il nome della classe e le parentesi graffe ({}) a delimitare l'inizio e la fine della struttura.

Come prima cosa vanno dichiarate le variabili locali, ovvero le variabili che saranno a disposizione di tutti i metodi e solo all'interno della struttura. Ovviamente, se non se ne ha bisogno possono essere omesse.

Di seguito va definito, se necessario, il costruttore, che è un metodo particolare il quale ha lo stesso nome della classe e viene eseguito al momento della creazione dell'oggetto. Il costruttore non è obbligatorio, una classe può anche non averlo, tuttavia nella maggior parte dei casi è comodo e si utilizza per eseguire delle operazioni "iniziali" necessarie al funzionamento dei metodi successivi.

Il costruttore può ricevere dei parametri che possono essere inizializzati a dei valori di default. Se al momento della dichiarazione dell'oggetto non vengono specificati valori diversi l'oggetto userà i valori stabiliti durante la dichiarazione del costruttore della classe.

Supponendo di avere una classe chiamata carrello il costruttore potrebbe essere qualcosa che inizializza le quantità a zero al momento della creazione dell'oggetto di tipo carrello:

  class carrello{
    var $q, $t_spesa, $user;

    function carrello($quantita=0, $totale_spesa=0, $utente="anonimo"){
       $this->q = $quantita;
       $this->t_spesa = $totale_spesa;
       $this->user = $utente;
    }

    function aggiungi($quantita){
       $this->q += $quantita; 
    }

    function svuota(){
       $this->q = 0;
       $this->t_spesa = 0;
       $this->user = "";      
    }
  }

Le variabili definite all'interno della classe saranno disponibili a tutti i metodi della stessa tramite l'uso del prefisso speciale $this-> che distingue le variabili e i metodi interni a "questa" classe.

Una volta definita la struttura della classe è possibile istanziare uno o più oggetti di quel tipo. La sintassi corretta per farlo è la seguente:

  $spesa_brdp = new carrello;
  $spesa_mirko = new carrello(0,1,"Mirko");

Sopra sono stati dichiarati due oggetti di tipo "carrello", nel primo caso i parametri di default sono stati lasciati invariati mentre nella seconda dichiarazione sono stati impostati parametri diversi da passare al costruttore per inizializzare il carrello.

Una volta creati, i due oggetti, sono entità separate e indipendenti, le variabili e i metodi dell'uno non possono in alcun modo influenzare quelli dell'altro. Questo è uno dei grandi vantaggi che si ha con la programmazione orientata agli oggetti oltre all'eleganza e alla semplicità del codice.

Non rimane che analizzare la sintassi per l'utilizzo dei metodi:

  $nome_oggetto->nome_metodo(eventuali_parametri);

Come accennato la sintassi è intuitiva, nell'esempio sopra si potrebbe aggiungere una quantità al carrello virtuale tramite il metodo aggiungi($quantita). Ecco come:

  /*
     si suppone di ricevere una variabile in GET contenente
     la quantità di oggetti da inserire nel carrello. Il classico
     problema di un sito di commercio elettronico
  */

  $q = $HTTP_GET_VARS["quantita"];
  
  // aggiungo la quantità nel carrello
  $spesa_brdp->aggiungi($q);

  // la raddoppio e la inserisco anche nel secondo carrello
  $q = $q * 2;      // oppure $q *= 2;
  $spesa_mirko->aggiungi($q);  

Supponendo che il vistatore voglia svuotare il proprio carrello cliccando su una voce particolare un parametro viene inviato ad una pagina PHP che richiama il metodo che elimina il contenuto del carrello. Ad esempio:

  /*
     si suppone di ricevere una variabile in GET contenente
     il tipo di operazione da eseguire.
  */

  if ($HTTP_GET_VARS["da_fare"]=="svuota"){
  
     // vuoto entrambi i carrelli
     $spesa_brdp->svuota();
     $spesa_mirko->svuota();  
  }

262.2   Utilizzo di classi e oggetti

In questo capitolo verrà trattato un esempio allo scopo di approfondire e consolidare la conoscenza della sintassi.

La classe seguente gestisce un minuscolo magazzino di automobili. Ovviamente non è di alcuna utilità applicativa ma aiuta ad acquisire dimestichezza con questo nuovo concetto.

0  <?
1   class automobile{
2
3     // Proprieta'
4     var $archivio;
5 
6     // costruttore della classe 
7     function automobile(){
8       $this->archivio = array("Audi"=>"A4", "Ford"=>"Focus, Fiesta","Fiat"=>"Stilo",
9                              "Lancia"=>"Libra","Renault"=>"Laguna, Megane"); 
10    } // fine costruttore
11
12    function modello($marca){
13      // ritorna il modello della marca passata
14      return $this->archivio["$marca"];
15    } // fine metodo modello
16
17    function elenco(){
18      // visualizza l'elenco completo marca - Modelli  
19      echo "<br>Elenco completo parco Auto:<br>";
20      foreach($this->archivio as $marca => $modello){
21        echo "<br>Per ".$marca." sono disponibili: ".$modello;
22      }
23    } // fine metodo elenco
24
25  } // Fine classe automobile
26
27 ?>
28
29 <html>
20 <body>
31
32 <? 
33  // creo l'oggetto di tipo automobile!
34  $concessionario = new automobile;
35
36  if($HTTP_GET_VARS["casa"] != "0"){
37    echo "Ecco i modelli <u>".$HTTP_GET_VARS["casa"]."</u> disponibili: 
38          <b>".$concessionario->modello($HTTP_GET_VARS["casa"])."</b>";
39  }else{ 
40    $concessionario->elenco();
41  }
42
43 ?>
44
45 <br><br><br>
46
47 <form method="get" action="<?=$PHP_SELF?>">
48   Seleziona la marca per avere i modelli disponibili:
49   <select name="casa">
50     <option value="0">Elenco completo
51     <option value="Audi">Audi
52     <option value="Ford">Ford
53     <option value="Fiat">Fiat
54     <option value="Lancia">Lancia
55     <option value="Renault">Renault
56   </select>
57
58   <input type="submit" value="Trova modelli!">
59 </form>
60
61 </body>
62 </html>

Dalla riga 1 alla 25 viene definita la nuova classe chiamata "automobile", che contiene una variabile $archivio, il costruttore automobile e due metodi modello ed elenco.

Come detto più volte, una classe al suo interno può contenere variabili e funzioni oltre a tutte le strutture messe a disposizione dal linguaggio.

Nell'esempio specifico il costruttore automobile non fa altro che riempire un array associativo assegnato alla variabile $archivio, tale variabile contiene i modelli delle varie marche disponibili nel magazzino.

Dopo il costruttore vengono definiti due semplici metodi: il primo, modello($marca), fornisce i modelli della marca passata come parametro, leggendoli dall'array $archivio e restituendoli tramite il comando return, proprio come in una semplice funzione. Tutto questo viene fatto nella riga 14. Il secondo, elenco, non restituisce alcun valore e non richiede parametri al momento della chiamata ma visualizza a schermo l'intero magazzino tramite un ciclo foreach nelle righe 20, 21 e 22.

A questo punto la dichiarazione della classe è completa, non resta che istanziare uno o più oggetti di tipo "automobile" per poter sfruttare i metodi definiti. L'esempio continua proprio con l'utilizzo di un oggetto.

Alla riga 34 viene dichiarato l'oggetto $concessionario di tipo automobile tramite l'istruzione:

  $concessionario = new automobile;

Al momento della dichiarazione viene eseguito il costruttore che, in questo caso, inizializza l'array $archivio (contenuto nel nuovo oggetto). Da questo momento sono disponibili tutti i metodi dell'oggetto $concessionario.

Nel caso specifico dell'esempio alle righe 38 e 40 vengono richiamati i due metodi definiti in precedenza. Tali metodi sono stati costruiti in modo diverso: il primo restituisce un valore tramite l'istruzione return mentre il secondo, elenco(), visualizza sullo schermo i dati senza ritornare alcun valore. Questa differenza nella definizione comporta un utilizzo diverso dei metodi.

Nel dettaglio, il metodo modello($marca) può essere associato ad una variabile o concatenato ad una stringa quindi può essere manipolato come una variabile. Il metodo elenco() invece, può essere usato solo in un modo, per visualizzare l'elenco di tutte le marche e modelli sullo schermo.

Ecco gli utilizzi dei metodi nel dettaglio:

 $concessionario = new automobile;

 // Concateno in una stringa
 echo "Ecco i modelli <u>Audi</u> disponibili: 
          <b>".$concessionario->modello("Audi")."</b>";

 // Oppure assegno ad una variabile
 $modelli = $concessionario->modello("Ford");

 // Mentre il metodo elenco può essere usato solo così:
 $concessionario->elenco();

Come detto gli oggetti sono entità separate, dunque è possibile istanziare più oggetti della stessa classe come:

 $concessionario = new automobile;
 $auto = new automobile;

 // Concateno in una stringa
 echo "Ecco i modelli <u>Audi</u> disponibili: 
          <b>".$auto->modello("Audi")."</b>";

 // Oppure assegno ad una variabile
 $modelli = $concessionario->modello("Ford");

 // Mentre il metodo elenco può essere usato solo così:
 $concessionario->elenco();

 // Mentre il metodo elenco può essere usato solo così:
 $auto->elenco();

L'esempio continua con un semplice modulo HTML che spedice una variabile contenente la marca selezionata a se stesso (tramite la variabile predefinita $PHP_SELF). Tale variabile viene passata al metodo che restituisce i modelli disponibili per la marca scelta. Se il valore della marca è 0 viene visualizzato l'elenco completo tramite l'utilizzo del secondo metodo.

Il funzionamento dell'esempio può essere verificato a questo indirizzo: <http://www.urcanet.it/brdp/php_manual/esempi/cap_7/1.php>

262.3   Esempi applicativi

Una volta chiarita la sintassi si può passare a scrivere una prima classe da collezionare. Nella programmazione di tutti i giorni ci sono operazioni che si ripetono e che quindi possono risultare noiose. Un classico esempio è la gestione dei formati delle date. Il PHP mette a disposizione numerose funzioni di gestione delle date, esse sono versatili e accettano numerose opzioni. Potrebbe essere vantaggioso scrivere una classe che formatta la data secondo le proprie necessità, ovvero nei formati che si utilizzano più frequentemente. Ecco un esempio:

1  <?
2
3  // --------------- DATA e ORA ---------------------
4  /* Formatta la data in vari formati.
5    è possibile aggiungere nuovi formati accodando
6    righe alla "switch" finale   
7  */
8 
9  class data_ora{
10 
11   // Proprieta'
12   var $mesi, $week;
13   var $ore, $minuti, $secondi;
14   var $gs, $mese, $gmese, $anno;
15 
16   // costruttore
17   function data_ora(){
18     // Salva in diverse variabili la data nei vari formati:
19     // definisce l'array per i mesi e per i giorni della settimana.
20 
21     $this->week = array(0=>"Domenica","Lunedì","Martedì","Mercoledì",
22                         "Giovedì","Venerdì","Sabato" ); 
23 
24     $this->mesi = array ("1"=>"Gennaio", "Febbraio", "Marzo", "Aprile", 
25                          "Maggio", "Giugno", "Luglio", "Agosto", 
26                          "Settembre", "Ottobre", "Novembre", "Dicembre");
27 
28     $this->gs = date("w");    // giorno della settimana 0 è domenica
29     $this->m = date("n");     // mese numerico 9 non 09    
30     $this->mm = date("m");    // mese stringa 09 non 9
31     $this->g = date("j");     // giorno del mese numerico 9 non 09
32     $this->gg = date("d");    // giorno del mese stringa 09 non 9
33     $this->anno = date("Y");  // anno ovviamente numerico
34 
35     $this->o = date("H");     // ore con lo zero avanti in formato 24
36     $this->mi = date("i");    // minuti con lo zero esempio: 09
37     $this->s = date("s");     // secondi con lo zero 09
38 
39   } // fine costruttore
40 
41 
42   function formatta($tipo_data){
43 
44     switch ($tipo_data) {
45       case 1:
46         return $this->g."-".$this->m."-".$this->anno;
47         break;
48       case 2:
49         return $this->anno."-".$this->m."-".$this->g;
50         break;
51       case 3:
52         return $this->m."-".$this->g."-".$this->anno;
53         break;
54       case 4:
55         return $this->week[$this->gs]." ".$this->g."-".$this->m."-
           ".$this->anno;
56         break;
57       case 5:
58         return $this->week[$this->gs]." ".$this->g."-".$this->mesi[$this->m]."-
           ".$this->anno;
59         break;
60       case 6:
61         return $this->week[$this->gs]." ".$this->gg."-".$this->mm."-
           ".$this->anno;
62         break;
63       case 7:
64         return $this->week[$this->gs]." ".$this->gg."-".$this->mesi[$this->m]."-
           ".$this->anno;
65         break;
66       case 8:
67         return $this->week[$this->gs]." ".$this->g."-".$this->mesi[$this->m]."-
           ".$this->anno." 
68                ore: ".$this->o.":".$this->mi;
69         break;
70     }
71 
72   } // fine metodo formattazione
73 
74 }
75 
76 ?>
77 
78 
79 <html>
80 <body>
81 
82 <? 
83 
84   $adesso = new data_ora;
85 
86   for ($i = 1; $i <= 8; $i++){
87     echo "<br>La data odierna formattata con <b>".$i."</b> è: 
       ".$adesso->formatta($i);  
88   }
89 ?>
90 
91 
92 </body>
93 </html>

Analizzando la classe nel dettaglio si vede che è composta da varie proprietà (le variabili), il costruttore ed un metodo. Il costruttore inizializza gli array contenenti i nomi dei giorni della settimana e dei mesi dell'anno, inoltre inizializza tutte le altre variabili con dei valori riferiti alla data "odierna" tramite la funzione predefinita date(). Tali variabili serviranno in seguito per estrarre i vari formati di data.

Il metodo formatta($tipo_data) in base al parametro passato restituisce una stringa contenente la data formattata in un particolare modo. Il parametro deve essere un intero nell'esempio compreso tra 1 e 8 ma nulla vieta di estendere l'elenco.

Il funzionamento è semplice, tramite una struttura switch (trattata nella sezione 257.5.4) il metodo concatena le variabili inizializzate dal costruttore in modo da generare una stringa particolare.

Per verificare il funzionamento della classe ed elencare tutti i formati delle date disponibili, l'esempio continua con la creazione di un oggetto $adesso di tipo data_ora e con un semplice ciclo for che richiama il metodo $adesso->formatta($i) passandogli i valori interi compresi tra 1 e 8 come vuole la dichiarazione della classe.

Il risultato dello script sarà simile a:

 La data odierna formattata con 1 è: 19-12-2002
 La data odierna formattata con 2 è: 2002-12-19
 La data odierna formattata con 3 è: 12-19-2002
 La data odierna formattata con 4 è: Giovedì 19-12-2002
 La data odierna formattata con 5 è: Giovedì 19-Dicembre-2002
 La data odierna formattata con 6 è: Giovedì 19-12-2002
 La data odierna formattata con 7 è: Giovedì 19-Dicembre-2002
 La data odierna formattata con 8 è: Giovedì 19-Dicembre-2002 ore: 10:40

Il metodo restituisce la data tramite l'istruzione return, quindi la chiamata al metodo può essere trattata come una variabile, infatti, nell'esempio viene concatenata ad una stringa (riga 87) per essere visualizzata sullo schermo.

Al lettore il compito di comprendere il comportamento del metodo nel caso in cui venga fornito un paramentro non intero oppure non compreso nell'intervallo di definizione della struttura di switch.

La prima parte di codice fino alla riga 77 potrebbe essere salvata in un file per diventare una sorta di libreria di seguito chiamata brdp_lib.php dove verranno raccolte tutte le classi di uso frequente. Una volta creato il file basterà includerlo all'inizio delle nuove pagine PHP per avere tutte le classi a disposizione. Dunque si potrà ottenere lo stesso risultato dell'esempio precedente creando il file brdp_lib.php e modificando l'esempio in questo modo:

 <? include("brdp_lib.php");?>

 <html>
 <body>

 <?
   $adesso = new data_ora;

   for ($i = 1; $i <= 8; $i++){
     echo "<br>La data odierna formattata con <b>".$i."</b> è:
       ".$adesso->formatta($i);
   }
 ?>

 </body>
 </html>

In questo modo oltre ad essere più chiara la struttura è anche più semplice aggiornare le funzionalità delle classi. Se ad esempio la classe viene già usata in dieci pagine differenti e si ha la necessità di aggiungere un nuovo tipo di formattazione oppure modificarne uno già esistente, basterà modificare un unico file per rendere le modifiche disponibili in tutte e dieci le pagine che utilizzano oggetti di quel tipo. Al contrario si dovrebbe ripetere la stessa modifica in dieci pagine diverse.

Anche in questo caso l'esempio è raggiungibile all'indirizzo: <http://www.urcanet.it/brdp/php_manual/esempi/cap_7/2.php>

La classe appena vista potrebbe formattare anche date diverse da quella odierna, ad esempio ricevendo un parametro passato al costruttore e impostato come default alla data attuale, in questo modo, se specificato, al momento della dichiarazione dell'oggetto verrà formattata una data particolare, altrimenti verrà presa come data quella odierna. Questa semplice modifica viene lasciata al lettore come esercizio.

Nei capitoli seguenti verranno studiate altre classi ed inserite nella libreria brdp_lib.php appena creata.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome classi_e_oggetti.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico]

Valid ISO-HTML!

CSS validator!

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Sub-domains

CDRoms - Magnatune - Librivox - Liber Liber - Encyclopaedia Britannica - Project Gutenberg - Wikipedia 2008 - Wikipedia 2007 - Wikipedia 2006 -

Other Domains

https://www.classicistranieri.it - https://www.ebooksgratis.com - https://www.gutenbergaustralia.com - https://www.englishwikipedia.com - https://www.wikipediazim.com - https://www.wikisourcezim.com - https://www.projectgutenberg.net - https://www.projectgutenberg.es - https://www.radioascolto.com - https://www.debitoformtivo.it - https://www.wikipediaforschools.org - https://www.projectgutenbergzim.com