diff --git a/appendices/comparisons.xml b/appendices/comparisons.xml new file mode 100644 index 000000000..dcf6c4a6a --- /dev/null +++ b/appendices/comparisons.xml @@ -0,0 +1,647 @@ + + + + Tabelle di confronto dei tipi PHP + + Le seguenti tabelle dimostrano i comportamenti dei + tipi PHP e degli + operatori di confronto, + sia per confronti deboli che stretti. Questo + supplemento è anche correlato alla sezione del manuale su + type juggling. + L'ispirazione è stata fornita da vari commenti degli utenti e dal lavoro su + BlueShoes. + + + Prima di utilizzare queste tabelle, è importante comprendere i tipi e i loro + significati. Per esempio, "42" è una string + mentre 42 è un int. &false; è un + bool mentre "false" è una + string. + + + + I Form HTML non passano interi, float o booleani; passano stringhe. + Per scoprire se una stringa è numerica, puoi usare + is_numeric. + + + + + Fare semplicemente if ($x) mentre $x è + non definito genererà un errore di livello E_NOTICE. + Invece, considera l'uso di empty o + isset e/o inizializza le tue variabili. + + + + + Alcune operazioni numeriche possono risultare in un valore rappresentato dalla costante + NAN. Qualsiasi confronto debole o stretto di questo valore + contro qualsiasi altro valore, incluso se stesso, ma eccetto &true;, avrà come risultato &false;. + (cioè NAN != NAN e NAN !== NAN) + Esempi di operazioni che producono NAN includono + sqrt(-1), asin(2) e + acosh(0). + + + + + Confronti di <varname>$x</varname> con funzioni PHP + + + + Espressione + gettype + empty + is_null + isset + bool : if($x) + + + + + $x = ""; + string + &true; + &false; + &true; + &false; + + + $x = null; + NULL + &true; + &true; + &false; + &false; + + + var $x; + NULL + &true; + &true; + &false; + &false; + + + $x non è definita + NULL + &true; + &true; + &false; + &false; + + + $x = []; + array + &true; + &false; + &true; + &false; + + + $x = ['a', 'b']; + array + &false; + &false; + &true; + &true; + + + $x = false; + bool + &true; + &false; + &true; + &false; + + + $x = true; + bool + &false; + &false; + &true; + &true; + + + $x = 1; + int + &false; + &false; + &true; + &true; + + + $x = 42; + int + &false; + &false; + &true; + &true; + + + $x = 0; + int + &true; + &false; + &true; + &false; + + + $x = -1; + int + &false; + &false; + &true; + &true; + + + $x = "1"; + string + &false; + &false; + &true; + &true; + + + $x = "0"; + string + &true; + &false; + &true; + &false; + + + $x = "-1"; + string + &false; + &false; + &true; + &true; + + + $x = "php"; + string + &false; + &false; + &true; + &true; + + + $x = "true"; + string + &false; + &false; + &true; + &true; + + + $x = "false"; + string + &false; + &false; + &true; + &true; + + + +
+
+ + + + Confronti deboli con <literal>==</literal> + + + + + &true; + &false; + 1 + 0 + -1 + "1" + "0" + "-1" + &null; + [] + "php" + "" + + + + + &true; + &true; + &false; + &true; + &false; + &true; + &true; + &false; + &true; + &false; + &false; + &true; + &false; + + + &false; + &false; + &true; + &false; + &true; + &false; + &false; + &true; + &false; + &true; + &true; + &false; + &true; + + + 1 + &true; + &false; + &true; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + + + 0 + &false; + &true; + &false; + &true; + &false; + &false; + &true; + &false; + &true; + &false; + &false;* + &false;* + + + -1 + &true; + &false; + &false; + &false; + &true; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + + + "1" + &true; + &false; + &true; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + + + "0" + &false; + &true; + &false; + &true; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + + + "-1" + &true; + &false; + &false; + &false; + &true; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + + + &null; + &false; + &true; + &false; + &true; + &false; + &false; + &false; + &false; + &true; + &true; + &false; + &true; + + + [] + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &true; + &false; + &false; + + + "php" + &true; + &false; + &false; + &false;* + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + + + "" + &false; + &true; + &false; + &false;* + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &true; + + + +
+ * &true; prima di PHP 8.0.0. +
+ + + + Confronti stretti con <literal>===</literal> + + + + + &true; + &false; + 1 + 0 + -1 + "1" + "0" + "-1" + &null; + [] + "php" + "" + + + + + &true; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + + + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + + + 1 + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + + + 0 + &false; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + + + -1 + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + + + "1" + &false; + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + &false; + + + "0" + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + &false; + + + "-1" + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &false; + &false; + + + &null; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + &false; + &false; + + + [] + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + &false; + + + "php" + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + &false; + + + "" + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &false; + &true; + + + +
+
+
+ + diff --git a/appendices/examples.xml b/appendices/examples.xml new file mode 100644 index 000000000..cf5424a8b --- /dev/null +++ b/appendices/examples.xml @@ -0,0 +1,38 @@ + + + + Informazioni sugli esempi del manuale + + Si noti che molti esempi nella documentazione PHP omettono la gestione + di errori ed eccezioni per chiarezza e brevità. + + + Questo non significa che la gestione degli errori debba essere omessa nel codice di produzione + poiché ciò può portare al lancio di TypeError, + alla conversione di valori di fallimento, come &false; in una stringa vuota, + o alla violazione di assunzioni che potrebbero causare bug difficili da tracciare. + Alcune estensioni forniscono esempi completi in cui è inclusa la gestione degli errori + per dimostrare l'uso corretto delle varie funzioni e metodi forniti + dall'estensione. + + + diff --git a/appendices/history.xml b/appendices/history.xml new file mode 100644 index 000000000..320347b71 --- /dev/null +++ b/appendices/history.xml @@ -0,0 +1,454 @@ + + + + + Storia di PHP e Progetti Correlati + + PHP ha fatto molta strada dalla sua nascita a metà degli anni '90. + Da umili inizi fino a diventare uno dei linguaggi più importanti + che alimentano il web, l'evoluzione di PHP è una favola da geek. + Intendiamoci, una crescita così esplosiva non è stata un compito facile. + Coloro che sono interessati a vedere brevemente come PHP è cresciuto + fino a diventare quello che è oggi, continuino a leggere. Se volete toccare + un pezzo di storia di Internet, potete trovare le vecchie release di + PHP nel PHP Museum. + + + + Storia di PHP + + + PHP Tools, FI, Construction Kit e PHP/FI + + PHP come è conosciuto oggi è in realtà il successore di un + prodotto chiamato PHP/FI. Creato nel 1994 da Rasmus Lerdorf, + la primissima incarnazione di PHP era un semplice insieme di + binari Common Gateway Interface (CGI) scritti nel linguaggio + di programmazione C. Originariamente usato per tracciare le visite + al suo curriculum online, chiamò la suite di script "Personal + Home Page Tools", più frequentemente riferito come "PHP Tools". + Col tempo, fu desiderata più funzionalità, e Rasmus riscrisse + PHP Tools, producendo un'implementazione molto più grande e ricca. + Questo nuovo modello era capace di interazione con database e altro, + fornendo un framework sul quale gli utenti potevano sviluppare semplici + applicazioni web dinamiche come guestbook. Nel giugno 1995, Rasmus + rilasciò + il codice sorgente di PHP Tools al pubblico, il che permise + agli sviluppatori di usarlo come ritenevano opportuno. Questo permise anche - + e incoraggiò - gli utenti a fornire correzioni per bug nel codice, + e a migliorarlo in generale. + + + Nel settembre di quell'anno, Rasmus espanse PHP e - per un + breve periodo - abbandonò effettivamente il nome PHP. Ora riferendosi agli + strumenti come FI (abbreviazione di "Forms Interpreter"), la nuova implementazione + includeva alcune delle funzionalità di base di PHP come lo conosciamo + oggi. Aveva variabili simili a Perl, interpretazione automatica + delle variabili dei form, e sintassi incorporata in HTML. La sintassi stessa + era simile a quella di Perl, anche se molto più limitata, semplice, + e un po' incoerente. Infatti, per incorporare il codice in un + file HTML, gli sviluppatori dovevano usare commenti HTML. Sebbene questo + metodo non fu del tutto ben accolto, FI continuò a godere di crescita + e accettazione come strumento CGI --- ma ancora non proprio come un linguaggio. + Tuttavia, questo iniziò a cambiare il mese seguente; nell'ottobre 1995, + Rasmus rilasciò una riscrittura completa del codice. Riportando il + nome PHP, fu ora (brevemente) chiamato "Personal Home Page Construction + Kit", e fu la prima release a vantare quello che era, all'epoca, + considerato un'interfaccia di scripting avanzata. Il linguaggio fu + deliberatamente progettato per assomigliare a C nella struttura, rendendolo una facile + adozione per sviluppatori familiari con C, Perl e linguaggi simili. + Essendo stato finora limitato a sistemi UNIX e conformi a POSIX, + si stava esplorando il potenziale per un'implementazione Windows NT. + + + Il codice subì un'altra revisione completa, e nell'aprile 1996, + combinando i nomi delle release passate, Rasmus introdusse PHP/FI. + Questa implementazione di seconda generazione iniziò a far evolvere veramente PHP + da una suite di strumenti a un linguaggio di programmazione a sé stante. + Includeva supporto integrato per database DBM, mSQL e Postgres95, + cookie, supporto per funzioni definite dall'utente, e molto altro. + Quel giugno, PHP/FI ricevette lo status di versione 2.0. Un fatto interessante + su questo, tuttavia, è che c'era solo una singola versione completa + di PHP 2.0. Quando finalmente si laureò dallo status beta + nel novembre 1997, il motore di parsing sottostante era già + in completa riscrittura. + + + Sebbene abbia avuto una breve vita di sviluppo, continuò a godere + di una crescente popolarità nel mondo ancora giovane dello sviluppo web. Nel + 1997 e 1998, PHP/FI aveva un seguito di diverse migliaia di utenti in tutto + il mondo. Un sondaggio Netcraft di maggio 1998 indicava che + quasi 60.000 domini riportavano header contenenti + "PHP", indicando che il server host lo aveva effettivamente installato. + Questo numero equivaleva a circa l'1% di tutti i domini su + Internet all'epoca. Nonostante queste cifre impressionanti, la maturazione + di PHP/FI era destinata a limitazioni; mentre c'erano diversi contributori + minori, era ancora principalmente sviluppato da un singolo individuo. + + + + Esempio di codice PHP/FI + + + + + + Hey, you are using Netscape!

+ + + + + Sorry, that record does not exist

+ + Welcome !

+ You have credits left in your account.

+ + +]]> + + + + + + + PHP 3 + + PHP 3.0 fu la prima versione che assomigliava da vicino a PHP come + esiste oggi. Trovando PHP/FI 2.0 ancora inefficiente e + carente delle funzionalità necessarie per alimentare un'applicazione eCommerce + che stavano sviluppando per un progetto universitario, Andi Gutmans e + Zeev Suraski di Tel Aviv, Israele, iniziarono un'altra completa + riscrittura del parser sottostante nel 1997. Avvicinandosi a Rasmus + online, discussero vari aspetti dell'implementazione corrente + e del loro risviluppo di PHP. In uno sforzo per + migliorare il motore e iniziare a costruire sulla base utenti esistente di PHP/FI, + Andi, Rasmus e Zeev decisero di collaborare nello + sviluppo di un nuovo linguaggio di programmazione indipendente. + Questo linguaggio interamente nuovo fu rilasciato con un nuovo nome, che + rimosse l'implicazione dell'uso personale limitato che il nome + PHP/FI 2.0 conteneva. Fu rinominato semplicemente 'PHP', con il + significato che divenne un acronimo ricorsivo - PHP: Hypertext Preprocessor. + + + Uno dei maggiori punti di forza di PHP 3.0 erano le sue potenti + funzionalità di estensibilità. Oltre a fornire agli utenti finali + un'interfaccia matura per database multipli, protocolli + e API, la facilità di estendere il linguaggio stesso attirò + dozzine di sviluppatori che inviarono una varietà di moduli. Probabilmente, + questa fu la chiave del tremendo successo di PHP 3.0. Altre funzionalità + chiave introdotte in PHP 3.0 includevano il supporto per la programmazione orientata agli oggetti + e una sintassi del linguaggio molto più potente e coerente. + + + Nel giugno 1998, con molti nuovi sviluppatori da tutto il mondo + che si univano allo sforzo, PHP 3.0 fu annunciato dal nuovo PHP Development + Team come il successore ufficiale di PHP/FI 2.0. Lo sviluppo attivo + di PHP/FI 2.0, che era praticamente cessato a novembre dell'anno + precedente, fu ora ufficialmente terminato. Dopo circa nove mesi + di test pubblico aperto, quando arrivò l'annuncio del rilascio ufficiale + di PHP 3.0, era già installato su oltre 70.000 + domini in tutto il mondo, e non era più limitato a + sistemi operativi conformi a POSIX. Una quota relativamente piccola di + domini che riportavano PHP come installato erano ospitati su server + che eseguivano Windows 95, 98 e NT, e Macintosh. Al suo picco, PHP 3.0 + era installato su circa il 10% dei server web su + Internet. + + + + + PHP 4 + + Nell'inverno del 1998, poco dopo il rilascio ufficiale di PHP 3.0, + Andi Gutmans e Zeev Suraski iniziarono a lavorare + su una riscrittura del core di PHP. Gli obiettivi di progettazione erano migliorare + le prestazioni delle applicazioni complesse e migliorare la + modularità del codice base di PHP. Tali applicazioni furono rese + possibili dalle nuove funzionalità di PHP 3.0 e dal supporto per un'ampia + varietà di database e API di terze parti, ma PHP 3.0 non era + progettato per gestire tali applicazioni complesse in modo efficiente. + + + Il nuovo motore, chiamato 'Zend Engine' (composto dai loro + nomi, Zeev e Andi), raggiunse con successo questi obiettivi di progettazione, + e fu introdotto per la prima volta a metà 1999. PHP 4.0, + basato su questo motore e accoppiato con un'ampia gamma di + nuove funzionalità aggiuntive, fu ufficialmente rilasciato nel maggio + 2000, quasi due anni dopo il suo predecessore. Oltre + alle prestazioni molto migliorate di questa versione, PHP 4.0 + includeva altre funzionalità chiave come il supporto per molti più + server web, sessioni HTTP, buffering dell'output, modi più sicuri + di gestire l'input degli utenti e diversi nuovi costrutti del linguaggio. + + + + + PHP 5 + + PHP 5 fu rilasciato nel luglio 2004 dopo un lungo sviluppo e diversi + pre-rilasci. È principalmente guidato dal suo core, lo + Zend Engine 2.0 con un + nuovo modello a oggetti e dozzine di altre nuove funzionalità. + + + Il team di sviluppo di PHP include dozzine di sviluppatori, così come + dozzine di altri che lavorano su progetti correlati a PHP e di supporto, + come PEAR, PECL e documentazione, e un'infrastruttura di rete + sottostante di ben oltre cento singoli server web + su sei dei sette continenti del mondo. Sebbene sia solo una + stima basata su statistiche degli anni precedenti, è sicuro + presumere che PHP sia ora installato su decine o forse centinaia + di milioni di domini in tutto il mondo. + + + + + PHP 6 + + Il piano per PHP 6 era di includere un supporto profondo per Unicode nel + motore e nel linguaggio. Questo lavoro fu poi abbandonato, ma altre + funzionalità che erano state previste per PHP 6 furono invece incorporate + in PHP 5.3 (namespace) + e PHP 5.4 (trait, + sintassi array "corta"). + + + + + PHP 7 + + PHP 7.0 fu rilasciato nel 2015, e presentava un'altra versione principale del + core, Zend Engine 3.0, che includeva + significativi miglioramenti delle prestazioni (fino a due volte più veloce di PHP + 5.6) e dell'uso della memoria, supporto coerente a 64 bit, miglioramenti + alle eccezioni, un generatore di numeri casuali sicuro, l'operatore null coalescing + (??), classi + anonime, e altre funzionalità. + + + Le release successive della serie PHP 7 introdussero più funzionalità del linguaggio + come la sintassi list corta (7.1), + dichiarazione di tipo per parametri oggetto e valori di ritorno (7.2), una nuova + sintassi flessibile per heredoc + e nowdoc + (7.3), proprietà tipizzate (7.4), e una nuova + interfaccia per funzioni esterne (7.4). + + + + + PHP 8 + + Rilasciato per la prima volta nel 2020, PHP 8.0 fu un altro importante aggiornamento del + linguaggio PHP. Conteneva molte nuove funzionalità e ottimizzazioni tra cui + argomenti con nome, + tipi + union, attributi, + promozione + delle proprietà nel costruttore, + espressioni match, + l'operatore nullsafe + (?->), un nuovo compilatore JIT ottimizzante, + e miglioramenti nel sistema dei tipi, nella gestione degli errori e nella coerenza. + + + Le release successive della serie PHP 8 introdussero nuove funzionalità del linguaggio + tra cui enumerazioni (8.1), + fiber (8.1), + classi readonly (8.2), + tipi in Forma Normale Disgiuntiva (DNF) (8.2), e costanti + di classe tipizzate (8.3). + + + + + + Storia dei progetti correlati a PHP + + + + + PEAR + + PEAR, il PHP Extension and + Application Repository (originariamente, PHP Extension and Add-on + Repository) è la versione PHP delle classi di base, e potrebbe crescere in + futuro per essere uno dei modi chiave per distribuire estensioni PHP tra + gli sviluppatori. + + + PEAR nacque nelle discussioni tenute al PHP Developers' + Meeting (PDM) tenutosi nel gennaio 2000 a Tel Aviv. Fu + creato da Stig S. Bakken, ed è dedicato alla sua primogenita, + Malin Bakken. + + + Dall'inizio del 2000, PEAR è cresciuto fino a diventare un grande e significativo + progetto con un gran numero di sviluppatori che lavorano + sull'implementazione di funzionalità comuni e riutilizzabili per il + beneficio dell'intera comunità PHP. PEAR oggi include + un'ampia varietà di classi di base dell'infrastruttura + per l'accesso al database, il caching dei contenuti, i calcoli + matematici, l'eCommerce e molto altro. + + + Maggiori informazioni su PEAR possono essere trovate nel manuale. + + + + + PHP Quality Assurance Initiative + + La PHP Quality Assurance + Initiative fu istituita nell'estate del 2000 in risposta alle + critiche che le release di PHP non venivano testate abbastanza bene per + ambienti di produzione. Il team ora consiste in un gruppo centrale di + sviluppatori con una buona comprensione del codice base di PHP. + Questi sviluppatori dedicano molto del loro tempo a + localizzare e correggere bug in PHP. Inoltre + ci sono molti altri membri del team che testano e + forniscono feedback su queste correzioni usando un'ampia varietà + di piattaforme. + + + + + PHP-GTK + + PHP-GTK è la soluzione PHP per + scrivere applicazioni GUI lato client. Andrei Zmievski ricorda il + processo di pianificazione e creazione di PHP-GTK: + +

+ + La programmazione GUI è sempre stata tra i miei interessi, e ho trovato + che Gtk+ è un toolkit molto carino, eccetto che programmarci + in C è un po' noioso. Dopo aver visto le implementazioni di PyGtk e GTK-Perl, + ho deciso di vedere se PHP poteva essere fatto + interfacciare con Gtk+, anche minimamente. A partire da agosto 2000, + ho iniziato ad avere un po' più di tempo libero, quindi è stato allora che ho iniziato + a sperimentare. La mia linea guida principale era l'implementazione di PyGtk + poiché era abbastanza completa nelle funzionalità e aveva una bella interfaccia + orientata agli oggetti. James Henstridge, l'autore di PyGtk, fornì consigli molto + utili durante quelle fasi iniziali. + + + Scrivere a mano le interfacce per tutte le funzioni Gtk+ era fuori + discussione, così mi sono aggrappato all'idea del generatore di codice, simile + a come faceva PyGtk. Il generatore di codice è un programma PHP che legge + un insieme di file .defs contenenti informazioni su classi, costanti e + metodi Gtk+ e genera codice C che interfaccia PHP con + essi. Quello che non può essere generato automaticamente può essere scritto a + mano nel file .overrides. + + + Lavorare sul generatore di codice e sull'infrastruttura richiese del + tempo, perché potevo dedicare poco tempo a PHP-GTK durante + l'autunno del 2000. Dopo aver mostrato PHP-GTK a Frank Kromann, si + interessò e iniziò ad aiutarmi con il lavoro sul generatore di codice + e l'implementazione Win32. Quando scrivemmo il primo programma Hello World + e lo avviammo, fu estremamente eccitante. Ci vollero + un altro paio di mesi per portare il progetto in una condizione presentabile + e la versione iniziale fu rilasciata il 1 marzo 2001. La + storia raggiunse prontamente SlashDot. + + + Percependo che PHP-GTK potesse essere esteso, ho impostato mailing + list separate e repository CVS per esso, così come il + sito web gtk.php.net con l'aiuto di Colin Viebrock. La + documentazione avrebbe anche dovuto essere fatta e James Moore + venne ad aiutare con quello. + + + Dal suo rilascio PHP-GTK ha guadagnato popolarità. Abbiamo + il nostro team di documentazione, il manuale continua a migliorare, + le persone iniziano a scrivere estensioni per PHP-GTK, e sempre + più applicazioni eccitanti con esso. + +
+
+
+ + + Libri su PHP + + Man mano che PHP cresceva, iniziò a essere riconosciuto come una piattaforma di + sviluppo popolare a livello mondiale. Uno dei modi più interessanti di + vedere questa tendenza era osservando i libri su PHP che + uscivano nel corso degli anni. + + + Per quanto ne sappiamo, il primo libro dedicato a PHP fu + 'PHP - tvorba interaktivních internetových aplikací' (PHP + - Creating Interactive Internet Applications) - un libro ceco + pubblicato nell'aprile 1999, scritto da Jirka Kosek. Il mese successivo + seguì un libro tedesco scritto da Egon Schmid, Christian Cartus + e Richard Blume. Il primo libro in inglese su PHP fu + pubblicato poco dopo, ed era 'Core PHP Programming' di + Leon Atkinson. Questi libri coprivano PHP 3.0. + + + Mentre questi libri furono i primi del loro genere - furono + seguiti da un gran numero di libri da una miriade di autori e + editori. Ci sono oltre 400 libri in inglese, oltre 100 libri in + tedesco, e oltre 50 libri in francese o spagnolo! Inoltre, puoi + trovare libri su PHP in molte altre lingue, incluso + coreano, giapponese ed ebraico. + + + Chiaramente, questo gran numero di libri, scritti da diversi + autori, pubblicati da molti editori, e la loro disponibilità + in così tante lingue - sono una forte testimonianza del successo + mondiale di PHP. + + + + + Pubblicazioni su PHP + + Per quanto ne sappiamo, il primo articolo su PHP in + una rivista cartacea fu pubblicato nella versione ceca di + Computerworld nella primavera del 1998, e copriva PHP 3.0. Come con + i libri, questo fu il primo di una serie di molti articoli pubblicati + su PHP in varie riviste importanti. + + + Articoli su PHP sono apparsi in Dr. Dobbs, Linux Enterprise, + Linux Magazine e molti altri. Articoli sulla migrazione di applicazioni + basate su ASP a PHP sotto Windows appaiono persino sul + MSDN di Microsoft! + + + +
+ + diff --git a/appendices/transports.xml b/appendices/transports.xml new file mode 100644 index 000000000..1472d38fb --- /dev/null +++ b/appendices/transports.xml @@ -0,0 +1,142 @@ + + + + Elenco dei Trasporti Socket Supportati + + Di seguito è riportato un elenco dei vari trasporti socket in stile URL + che PHP ha integrati per l'uso con le funzioni socket basate sugli stream + come fsockopen e + stream_socket_client. Questi trasporti + non si applicano alle + Funzioni Socket dell'estensione Sockets. + + + + Per un elenco dei trasporti installati nella tua versione di + PHP usa stream_get_transports. + + +
+ Dominio Internet: TCP, UDP, SSL e TLS + + ssl://, tls://, + sslv2:// & sslv3://. + + + + + Se non viene specificato alcun trasporto, verrà assunto tcp://. + + + + + 127.0.0.1 + fe80::1 + www.example.com + tcp://127.0.0.1 + tcp://fe80::1 + tcp://www.example.com + udp://www.example.com + ssl://www.example.com + sslv2://www.example.com + sslv3://www.example.com + tls://www.example.com + + + + I socket del dominio Internet si aspettano un numero di porta oltre + a un indirizzo di destinazione. Nel caso di fsockopen + questo è specificato in un secondo parametro e quindi non + influisce sulla formattazione dell'URL del trasporto. Con + stream_socket_client e funzioni correlate, + come con gli URL tradizionali, il numero di porta è specificato + come suffisso dell'URL del trasporto delimitato da due punti. + + + + tcp://127.0.0.1:80 + tcp://[fe80::1]:80 + tcp://www.example.com:80 + + + + Indirizzi IPv6 numerici con numeri di porta + + Nel secondo esempio sopra, mentre gli esempi IPv4 e hostname + sono lasciati intatti a parte l'aggiunta dei + due punti e del numero di porta, l'indirizzo IPv6 è racchiuso tra + parentesi quadre: [fe80::1]. Questo serve a + distinguere tra i due punti usati in un indirizzo IPv6 e + i due punti usati per delimitare il numero di porta. + + + + + I trasporti ssl:// e tls:// + (disponibili solo quando il supporto openssl è compilato in PHP) sono estensioni + del trasporto tcp:// che includono la crittografia SSL. + + + + ssl:// tenterà di negoziare una connessione SSL V2 + o SSL V3 a seconda delle capacità e delle preferenze + dell'host remoto. sslv2:// e + sslv3:// selezioneranno il protocollo SSL V2 o SSL V3 + esplicitamente. + +
+ +
+ Dominio Unix: Unix e UDG + + unix:// e + udg://. + + + + unix:///tmp/mysock + udg:///tmp/mysock + + + + unix:// fornisce accesso a una connessione stream socket + nel dominio Unix. udg:// fornisce + un trasporto alternativo a un socket del dominio Unix usando il protocollo + user datagram. + + + + I socket del dominio Unix, a differenza dei socket del dominio Internet, non si aspettano + un numero di porta. Nel caso di fsockopen il + parametro portno dovrebbe essere impostato a 0. + + + + + I socket del dominio Unix non sono supportati su Windows. + + +
+ +
+ + diff --git a/faq/figures/crypt-text-rendered.svg b/faq/figures/crypt-text-rendered.svg new file mode 100644 index 000000000..cac09fc34 --- /dev/null +++ b/faq/figures/crypt-text-rendered.svg @@ -0,0 +1,793 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/faq/html.xml b/faq/html.xml new file mode 100644 index 000000000..dfacdbf3d --- /dev/null +++ b/faq/html.xml @@ -0,0 +1,353 @@ + + + + PHP e HTML + PHP e HTML + + + PHP e HTML interagiscono molto: PHP può generare HTML, e HTML + può passare informazioni a PHP. Prima di leggere queste FAQ, è + importante imparare come recuperare + variabili da fonti esterne. La pagina del manuale su + questo argomento include anche molti esempi. + + + + + + + Quale codifica/decodifica devo usare quando passo un valore attraverso un form/URL? + + + + + Ci sono diverse fasi per le quali la codifica è importante. Supponendo che + tu abbia una string $data, che contiene + la stringa che vuoi passare in modo non codificato, queste sono le + fasi rilevanti: + + + + Interpretazione HTML. Per specificare una stringa arbitraria, + devi includerla tra virgolette doppie e + usare htmlspecialchars sull'intero valore. + + + + + URL: Un URL è composto da diverse parti. Se vuoi che i tuoi dati siano + interpretati come un singolo elemento, devi codificarli con + urlencode. + + + + + + + Un elemento nascosto di un form HTML + +'."\n"; +?> +]]> + + + + + È sbagliato usare urlencode su + $data, perché è responsabilità del browser + fare urlencode sui dati. Tutti i browser popolari lo fanno + correttamente. Nota che questo avverrà indipendentemente dal metodo (cioè, + GET o POST). Lo noterai solo nel caso di richieste GET però, + perché le richieste POST sono solitamente nascoste. + + + + Dati da modificare dall'utente + +\n"; + echo htmlspecialchars($data)."\n"; + echo ""; +?> +]]> + + + + + I dati sono mostrati nel browser come previsto, perché il browser + interpreterà i simboli HTML con escape. + + + All'invio, sia tramite GET che POST, i dati saranno codificati URL + dal browser per il trasferimento, e decodificati direttamente da PHP. Quindi alla + fine, non hai bisogno di fare alcuna codifica/decodifica URL tu stesso, + tutto viene gestito automaticamente. + + + + In un URL + +'."\n"; +?> +]]> + + + + + In effetti stai simulando una richiesta HTML GET, quindi è necessario + fare manualmente urlencode sui dati. + + + + + Devi usare htmlspecialchars sull'intero URL, perché l'URL + appare come valore di un attributo HTML. In questo caso, il browser + prima rimuoverà l'escape htmlspecialchars dal valore, e poi passerà + l'URL. PHP capirà l'URL correttamente, perché hai + usato urlencode sui dati. + + + Noterai che il & nell'URL è sostituito + da &amp;. Anche se la maggior parte dei browser recupererà + se dimentichi questo, non è sempre possibile. Quindi anche se il tuo URL non è + dinamico, devi usare + htmlspecialchars sull'URL. + + + + + + + + + + + Sto cercando di usare un tag <input type="image">, ma + le variabili $foo.x e $foo.y + non sono disponibili. $_GET['foo.x'] non esiste + nemmeno. Dove sono? + + + + + Quando si invia un form, è possibile usare un'immagine invece del + pulsante di invio standard con un tag come: + + +]]> + + Quando l'utente clicca da qualche parte sull'immagine, il form + corrispondente sarà trasmesso al server con due variabili aggiuntive: + foo.x e foo.y. + + + Poiché foo.x e foo.y + sarebbero nomi di variabili non validi in PHP, vengono automaticamente convertiti in + foo_x e foo_y. Cioè, i + punti sono sostituiti da underscore. Quindi, accederesti a queste variabili + come qualsiasi altra descritta nella sezione sul recupero di + variabili da fonti + esterne. Per esempio, $_GET['foo_x']. + + + Gli spazi nei nomi delle variabili di richiesta sono convertiti in underscore. + + + + + + + + + Come creo array in un <form> HTML? + + + + Per ottenere il risultato del tuo <form> inviato come + array al tuo script PHP + nomina gli elementi <input>, <select> o <textarea> + in questo modo: + + + + + +]]> + + Nota le parentesi quadre dopo il nome della variabile, è questo che + lo rende un array. Puoi raggruppare gli elementi in array diversi + assegnando lo stesso nome a elementi diversi: + + + + + +]]> + + Questo produce due array, MyArray e MyOtherArray, che vengono inviati + allo script PHP. È anche possibile assegnare chiavi specifiche + ai tuoi array: + + + + + +]]> + + L'array AnotherArray conterrà ora le chiavi 0, 1, email e phone. + + + + + Specificare le chiavi dell'array è opzionale in HTML. Se non specifichi + le chiavi, l'array viene riempito nell'ordine in cui gli elementi appaiono nel + form. Il nostro primo esempio conterrà le chiavi 0, 1, 2 e 3. + + + + + Vedi anche + Funzioni Array e + Variabili da Fonti + Esterne. + + + + + + + + Come ottengo tutti i risultati da un tag HTML select multiple? + + + + + Il tag select multiple in un costrutto HTML permette agli utenti di + selezionare più elementi da una lista. Questi elementi vengono poi passati + al gestore dell'azione per il form. Il problema è che vengono + tutti passati con lo stesso nome del widget. Cioè + + +]]> + + Ogni opzione selezionata arriverà al gestore dell'azione come: + +var=option1 +var=option2 +var=option3 + + Ogni opzione sovrascriverà il contenuto della precedente + variabile $var. La soluzione è usare + la funzionalità PHP "array da elemento form". Dovrebbe essere + usato quanto segue: + + +]]> + + Questo dice a PHP di trattare $var come un array e + ogni assegnazione di un valore a var[] aggiunge un elemento all'array. + Il primo elemento diventa $var[0], il successivo + $var[1], ecc. La funzione count + può essere usata per determinare quante opzioni sono state selezionate, + e la funzione sort può essere usata per ordinare + l'array delle opzioni se necessario. + + + Nota che se stai usando JavaScript le [] + nel nome dell'elemento potrebbero causare problemi quando provi a + riferirti all'elemento per nome. Usa invece l'ID numerico dell'elemento form, + o racchiudi il nome della variabile tra apici singoli e + usalo come indice dell'array elements, per esempio: + +variable = document.forms[0].elements['var[]']; + + + + + + + + + Come posso passare una variabile da Javascript a PHP? + + + + + Poiché Javascript è (solitamente) una tecnologia lato client, e + PHP è (solitamente) una tecnologia lato server, e poiché HTTP è un + protocollo "stateless", i due linguaggi non possono condividere direttamente + variabili. + + + È, tuttavia, possibile passare variabili tra i due. + Un modo per farlo è generare codice Javascript + con PHP, e far aggiornare il browser, passando variabili specifiche + allo script PHP. L'esempio sotto mostra + precisamente come fare questo -- permette al codice PHP di catturare la larghezza + e l'altezza dello schermo, qualcosa che normalmente è possibile solo + lato client. + + + + Generare Javascript con PHP + +\n"; + echo "Screen height is: ". $_GET['height'] ."
\n"; +} else { + // pass the geometry variables + // (preserve the original query string + // -- post variables will need to handled differently) + + echo "\n"; + exit(); +} +?> +]]> +
+
+
+
+
+ +
+
+ + diff --git a/faq/passwords.xml b/faq/passwords.xml new file mode 100644 index 000000000..527c20fff --- /dev/null +++ b/faq/passwords.xml @@ -0,0 +1,192 @@ + + + + Hashing delle password in modo sicuro + Hashing delle Password + + + Questa sezione spiega le ragioni per cui usare le funzioni di hashing + per proteggere le password, e come farlo in modo efficace. + + + + + + + Perché dovrei applicare l'hash alle password fornite dagli utenti? + + + + + L'hashing delle password è una delle considerazioni di sicurezza più basilari che + devono essere fatte quando si progetta qualsiasi applicazione o servizio che accetta password + dagli utenti. Senza hashing, qualsiasi password memorizzata + può essere rubata se l'archivio dati viene compromesso, e + poi usata immediatamente per compromettere non solo l'applicazione o il servizio, ma anche + gli account degli utenti su altri servizi, se non usano + password uniche. + + + Applicando un algoritmo di hashing alle password degli utenti prima di memorizzarle, + diventa implausibile per qualsiasi attaccante + determinare la password originale, pur essendo ancora in grado di confrontare + l'hash risultante con la password originale in futuro. + + + È importante notare, tuttavia, che l'hashing delle password le protegge solo + dall'essere compromesse nell'archivio dati, ma non le protegge necessariamente + dall'essere intercettate da codice malevolo iniettato nell'applicazione + o nel servizio stesso. + + + + + + + Perché le funzioni di hashing comuni come md5 e + sha1 non sono adatte per le password? + + + + + Gli algoritmi di hashing come MD5, SHA1 e SHA256 sono progettati per essere + molto veloci ed efficienti. Con le tecniche moderne e l'equipaggiamento informatico, + è diventato banale fare brute force sull'output di questi algoritmi, + per determinare l'input originale. + + + A causa della rapidità con cui un computer moderno può invertire questi algoritmi + di hashing, molti professionisti della sicurezza sconsigliano fortemente + il loro uso per l'hashing delle password. + + + + + + + Come dovrebbero essere hashate le password, se le funzioni di hash comuni non sono + adatte? + + + + + Quando si hashano le password, le due considerazioni più importanti sono il + costo computazionale e il salt. Più è computazionalmente costoso + l'algoritmo di hashing, più tempo ci vorrà per fare brute force sul suo + output. + + + PHP fornisce + un'API nativa per l'hashing delle password che + gestisce in modo sicuro sia l'hashing + che la verifica delle password + in modo sicuro. + + + L'algoritmo suggerito da usare per l'hashing delle password è Blowfish, che + è anche il default usato dall'API di hashing delle password, poiché è + significativamente più costoso computazionalmente rispetto a MD5 o SHA1, pur + rimanendo scalabile. + + + La funzione crypt è anche disponibile per l'hashing + delle password, ma è raccomandata solo per l'interoperabilità con altri + sistemi. + Invece, è fortemente incoraggiato l'uso dell'API nativa per l'hashing delle password + quando possibile. + + + + + + + Cos'è un salt? + + + + + Un salt crittografico è un dato che viene applicato durante il processo di hashing + per eliminare la possibilità che l'output venga cercato + in una lista di coppie pre-calcolate di hash e relativi input, nota come + rainbow table. + + + In termini più semplici, un salt è un po' di dati aggiuntivi che rende + gli hash significativamente più difficili da craccare. Ci sono diversi + servizi online che forniscono liste estese di hash pre-calcolati, così + come l'input originale per quegli hash. L'uso di un salt rende + implausibile o impossibile trovare l'hash risultante in una di queste + liste. + + + password_hash creerà un salt casuale se non ne viene + fornito uno, e questo è generalmente l'approccio più semplice e sicuro. + + + + + + + Come vengono memorizzati i salt? + + + + + Quando si usa password_hash o + crypt, il valore restituito include il salt come parte + dell'hash generato. Questo valore dovrebbe essere memorizzato così com'è nel + database, poiché include informazioni sulla funzione hash che è stata + usata e può quindi essere passato direttamente a + password_verify quando si verificano le password. + + + + password_verify dovrebbe sempre essere usato invece + di ri-hashare e confrontare il risultato con un hash memorizzato per + evitare attacchi di timing. + + + + Il seguente diagramma mostra il formato di un valore restituito da + crypt o password_hash. Come si può + vedere, sono auto-contenuti, con tutte le informazioni sull'algoritmo + e sul salt necessarie per la futura verifica della password. + + + + + I componenti del valore restituito da password_hash e crypt: in + ordine, l'algoritmo scelto, le opzioni dell'algoritmo, il salt usato, + e la password hashata. + + + + + + + + + + + + + diff --git a/faq/using.xml b/faq/using.xml new file mode 100644 index 000000000..9c0934471 --- /dev/null +++ b/faq/using.xml @@ -0,0 +1,372 @@ + + + + Usare PHP + Usare PHP + + + Questa sezione raccoglie molti errori comuni che potresti incontrare + mentre scrivi script PHP. + + + + + + + + + Non riesco a ricordare l'ordine dei parametri delle funzioni PHP, sono casuali? + + + + + PHP è un collante che unisce centinaia di librerie esterne, quindi a volte + questo diventa confuso. Tuttavia, una semplice regola empirica è la seguente: + + + I parametri delle funzioni Array sono ordinati + come "needle, haystack" mentre le + funzioni String sono il contrario, + quindi "haystack, needle". + + + + + + + + Vorrei scrivere uno script PHP generico che possa gestire dati provenienti + da qualsiasi form. Come faccio a sapere quali variabili POST sono disponibili? + + + + + PHP offre molte + variabili predefinite, come la superglobale $_POST. + Puoi iterare attraverso $_POST + poiché è un array associativo di tutti i valori POSTati. Per esempio, + iteriamo semplicemente con &foreach;, + controlliamo i valori empty, + e stampiamoli. + + $varvalue) { + if (empty($varvalue)) { + $empty[$varname] = $varvalue; + } else { + $post[$varname] = $varvalue; + } +} + +print "
";
+if (empty($empty)) {
+    print "Nessuno dei valori POSTati è vuoto, postati:\n";
+    var_dump($post);
+} else {
+    print "Abbiamo " . count($empty) . " valori vuoti\n";
+    print "Postati:\n"; var_dump($post);
+    print "Vuoti:\n";  var_dump($empty);
+    exit;
+}
+?>
+]]>
+      
+     
+
+    
+   
+
+   
+    
+    
+     
+      Devo convertire tutti gli apici singoli (') in un backslash
+      seguito da un apice singolo (\'). Come posso farlo con un'espressione
+      regolare? Vorrei anche convertire " in \" e
+      \ in \\.
+     
+    
+    
+     
+      Supponendo che questo sia per un database, usa il meccanismo di escape che
+      viene fornito con il database. Per esempio, usa
+      mysql_real_escape_string con MySQL e
+      pg_escape_string con PostgreSQL. Ci sono
+      anche le funzioni generiche addslashes e
+      stripslashes, che sono più
+      comuni con codice PHP più vecchio.
+     
+    
+   
+
+   
+    
+     
+      Quando faccio quanto segue, l'output è stampato nell'ordine
+      sbagliato:
+     
+
+]]>
+    
+     cosa sta succedendo?
+     
+    
+    
+     
+      Per poter usare i risultati della tua funzione in un'espressione (come
+      concatenarli con altre stringhe nell'esempio sopra), devi
+      fare return del valore,
+      non echo.
+     
+    
+   
+
+   
+    
+     
+      Ehi, cosa è successo ai miei a capo?
+      
+
+
+
+
+]]> +
+
+ + + + In PHP, la fine di un blocco di codice è "?>" o + "?>\n" (dove \n significa a capo). Quindi nell'esempio sopra, + le frasi stampate saranno su una sola riga, perché PHP omette + gli a capo dopo la fine del blocco. Questo significa che devi + inserire un a capo extra dopo ogni blocco di codice PHP per farlo + stampare un a capo. + + + Perché PHP fa questo? Perché quando si formatta HTML normale, questo + di solito ti rende la vita più facile perché non vuoi quell'a capo, + ma dovresti creare righe estremamente lunghe o altrimenti rendere il + sorgente della pagina illeggibile per ottenere quell'effetto. + + +
+ + + + + Ricevo il messaggio 'Warning: Cannot send session cookie - headers already + sent...' o 'Cannot add header information - headers already sent...'. + + + + + Le funzioni header, setcookie, + e le funzioni di sessione + devono aggiungere header al flusso di output ma gli header + possono essere inviati solo prima di tutto il resto del contenuto. Non ci può essere nessun output + prima di usare queste funzioni, output come HTML. La funzione + headers_sent controllerà se il tuo script ha già + inviato header e vedi anche le funzioni di + Controllo dell'Output. + + + + + + + + Ho bisogno di accedere direttamente alle informazioni nell'header della richiesta. + Come posso farlo? + + + + + La funzione getallheaders farà questo se + stai eseguendo PHP come modulo Apache. Quindi, il seguente pezzo + di codice ti mostrerà tutti gli header della richiesta: + + $content) { + echo "headers[$name] = $content
\n"; +} +?> +]]> +
+
+ + Vedi anche + apache_lookup_uri, + apache_response_headers, e + fsockopen + +
+
+ + + + + Quando provo a usare l'autenticazione con IIS ottengo 'No Input file specified'. + + + + + Il modello di sicurezza di IIS è in difetto qui. Questo è un problema + comune a tutti i programmi CGI eseguiti sotto IIS. Una soluzione è + creare un file HTML semplice (non interpretato da PHP) come pagina di ingresso + in una directory autenticata. Poi usare un tag META per reindirizzare + alla pagina PHP, o avere un link alla pagina PHP. PHP + riconoscerà quindi l'autenticazione correttamente. + Questo non dovrebbe influenzare altri + server web NT. Per maggiori informazioni, vedi: + &url.iis; e la sezione del manuale + su Autenticazione HTTP. + + + + + + + + Windows: Non riesco ad accedere a file condivisi su un altro computer usando IIS + + + + + Devi cambiare Vai a Internet Information + Services. Localizza il tuo file PHP e vai alle sue proprietà. + Vai alla scheda Sicurezza File, Modifica -< + Accesso anonimo e controllo autenticazione. + + + Puoi risolvere il problema sia deselezionando Accesso + Anonimo e lasciando selezionato Autenticazione Integrata + Windows, oppure selezionando Accesso + Anonimo e modificando l'utente che potrebbe non avere i diritti + di accesso. + + + + + + + + Come faccio a mescolare XML e PHP? Si lamenta dei miei tag <?xml! + + + + + Per incorporare <?xml direttamente nel tuo codice PHP, dovrai disattivare + gli short tag avendo la direttiva PHP + short_open_tags impostata su + 0. Non puoi impostare questa direttiva con + ini_set. Indipendentemente dal fatto che + short_open_tags sia attivo o + meno, puoi fare qualcosa come: <?php echo '<?xml'; ?>. + Il default per questa direttiva è On. + + + + + + + + Dove posso trovare una lista completa delle variabili disponibili in PHP? + + + + + Leggi la pagina del manuale sulle + variabili predefinite poiché include una lista parziale delle variabili + predefinite disponibili per il tuo script. Una lista completa delle variabili + disponibili (e molte più informazioni) può essere vista chiamando la + funzione phpinfo. Assicurati di leggere la sezione + del manuale su variabili + esterne a PHP poiché descrive scenari comuni per + variabili esterne, come da un form HTML, un Cookie e l'URL. + + + + + + + + Come posso generare file PDF senza usare librerie non libere e + commerciali come PDFLib? Vorrei qualcosa che sia + gratuito e non richieda librerie PDF esterne. + + + + + Ci sono alcune alternative scritte in PHP come + FPDF e + TCPDF. + + + + + + + + Alcune direttive PHP possono anche accettare valori abbreviati per i byte, al contrario + dei soli valori in byte int. Quali sono tutte le opzioni + abbreviate per i byte disponibili? + + + + + Le opzioni disponibili sono K (per Kilobyte), M (per Megabyte) e G (per + Gigabyte), e sono tutte case-insensitive. + Qualsiasi altra cosa assume byte. 1M equivale a un Megabyte o + 1048576 byte. 1K equivale a un + Kilobyte o 1024 byte. Queste notazioni abbreviate possono + essere usate in &php.ini; e nella funzione ini_set. + Nota che il valore numerico viene convertito in int; + per esempio, 0.5M è interpretato come 0. + + + kilobyte versus kibibyte + + La notazione PHP descrive un kilobyte come uguale a 1024 byte, mentre + lo standard IEC lo considera un kibibyte. + Riepilogo: k e K = 1024 byte. + + + + +
+
+ +