PHP: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m →Ambienti di sviluppo: clean up, replaced: IDE → IDE |
Annullata la modifica 142934040 di Simone Biancolilla (discussione) Etichetta: Annulla |
||
(26 versioni intermedie di 12 utenti non mostrate) | |||
Riga 4:
|immagine = PHP-logo.svg
|autore = PHP Group
|data =
|versione =
|utilizzo = Applicazioni web lato server
|paradigmi =
|tipizzazione = Debole
|specifiche =
|influenzato_da =
|ha_influenzato =
|implementazione_riferimento = Interprete
|sistema_operativo = [[Multipiattaforma]]
|lingua =
}}
'''PHP''' ([[
Attualmente è principalmente utilizzato per sviluppare [[
Grazie soprattutto alla diffusione di [[WordPress
== Storia ==
{{Immagine multipla
|larghezza totale = 400
|immagine1 = Rasmus Lerdorf cropped.jpg
|immagine2 = Andi Gutmans 1.jpg
|immagine3 = Zeev Suraski 2005 cropped.jpg
|sotto = Rasmus Lerdorf, creatore di PHP e Andi Gutmans e Zeev Suraski, creatori dello Zend Engine, l'interprete standard del linguaggio
}}
=== Origini ===
Nato nel
Il pacchetto originario venne in seguito esteso e riscritto dallo stesso Lerdorf in [[C (linguaggio di programmazione)|C]], aggiungendo funzionalità quali il supporto alla base di dati [[mSQL]], e iniziò a chiamarsi PHP/FI, dove ''FI'' sta per ''
=== PHP 3 ===
Il linguaggio cominciò a godere di una certa popolarità tra i progetti ''open source'' del
=== PHP 4 ===
PHP diventò a questo punto sufficientemente maturo da competere con i linguaggi
La popolarità del linguaggio PHP
Nel 2005 la configurazione [[LAMP]] ([[Linux]], [[Apache HTTP Server|Apache]], [[MySQL]], PHP) ha superato il {{M|50|u=%}} del totale dei server sulla rete mondiale.
=== PHP 5 ===
Nel 2008 PHP 5 è diventata l'unica versione stabile in fase di sviluppo. A partire da PHP 5.3.0 il linguaggio implementa una funzione chiamata
A partire dal 5 febbraio 2008, a causa dell'iniziativa ''GoPHP5'' sostenuta da una serie di sviluppatori PHP, molti dei progetti ''open source'' di alto profilo hanno cessato di supportare PHP 4 nel nuovo codice e hanno promosso il passaggio da PHP 4 a PHP 5.<ref>{{Cita web|url=https://pear.php.net/gophp5.php|titolo=GOPHP5!|sito=pear.php.net|lingua=en|accesso=26 settembre 2017}}</ref> La versione 5 di PHP ha raggiunto la release 5.6 prima di essere abbandonata dal punto di vista dello sviluppo e del supporto nel gennaio 2019.<ref name=":0">{{Cita web|url=https://www.php.net/eol.php|titolo=PHP: Unsupported Branches|sito=www.php.net|lingua=en|accesso=2022-12-12}}</ref>
=== PHP 7 ===
Riga 54:
=== PHP 8 ===
Il 27 novembre 2020 è stata pubblicata la versione 8.<ref>{{Cita web|url=https://www.php.net/ChangeLog-8.php|titolo=PHP 8 ChangeLog|accesso=2022-01-12}}</ref> È la prima versione di PHP a supportare la [[Compilatore just-in-time|compilazione just-in-time]], aumentando di gran lunga le prestazioni.<ref>{{Cita web|url=https://stitcher.io/blog/jit-in-real-life-web-applications|titolo=PHP 8: JIT performance in real-life web applications|sito=stitcher.io|data=2 luglio 2020|lingua=en|accesso=2022-12-12}}</ref>
== Caratteristiche ==
PHP riprende per molti versi la [[sintassi]] del [[C (linguaggio)|C]], come peraltro fanno molti linguaggi moderni, e del [[Perl]]. È un linguaggio a [[tipizzazione debole]] e dalla versione 5 migliora il supporto al paradigma di [[
PHP è in grado di interfacciarsi a innumerevoli [[DBMS]] tra cui [[MySQL]], [[PostgreSQL]], [[MariaDB]], [[Oracle Database|Oracle]], [[Firebird SQL|Firebird]], [[IBM DB2]], [[Microsoft SQL Server]] e anche basi di dati
Fornisce un'[[Application programming interface|API]] specifica per interagire con [[Apache HTTP Server|Apache]], sebbene funzioni naturalmente con numerosi altri [[Web server|server web]]. È ben integrato senza l'uso di componenti esterni con il DBMS [[MySQL]]/[[MariaDB]] per il quale possiede più di una API (mysql, mysqli, PDO). A partire
Dispone di un archivio chiamato [[PHP Extension and Application Repository
PHP non ha ancora un supporto nativo per le stringhe [[Unicode]] o multibyte; il supporto Unicode è in fase di sviluppo per una futura versione di PHP e consentirà di usare caratteri non [[ASCII]] in stringhe e nomi di funzioni, classi e metodi.
=== Sicurezza ===
La percentuale di software non sicuro scritto in PHP, sul totale di tutte le falle di sicurezza nei software elencate dal [[Common Vulnerabilities and Exposures]], ammontava al: {{M|12|u=%}} nel 2003, {{M|20|u=%}} nel 2004, {{M|28|u=%}} nel 2005, {{M|43|u=%}} nel 2006, {{M|36|u=%}} nel 2007, {{M|34
La maggior parte del software con problemi di sicurezza (2006) è associabile temporalmente con vecchie versioni di PHP in cui le configurazioni di default lasciavano spazio a una relativa semplicità nello scrivere software con potenziali problemi di sicurezza anche gravi.
È sempre buona norma rivedere la propria configurazione di PHP, contenuta generalmente nel file php.ini, per controllare le funzionalità attivate. Di solito nel file stesso si documentano 3 tipi di configurazioni: Configurazione di PHP
Nel sito ufficiale è presente l'archivio storico delle [[Release (informatica)|versioni]] dismesse, aggiornato a novembre 2022.<ref name=":0" />
==== Attacchi hacker ====
PHP può essere soggetto a diversi [[Attacco informatico|attacchi hacker]]<ref>{{Cita web|url=https://www.wordfence.com/learn/understanding-php-vulnerabilities/|titolo=What are PHP Vulnerabilities & How Do They Originate?|cognome=|sito=Wordfence|lingua=en|accesso=28 gennaio 2021|urlarchivio=https://web.archive.org/web/20210129160545/https://www.wordfence.com/learn/understanding-php-vulnerabilities/|urlmorto=no}}</ref>:
* ''Remote Code Execution'' (RCE) si verifica quando un utente malintenzionato è in grado di caricare codice sul sito
* [[SQL injection|SQL Injection]] o SQLi: permette agli attaccanti di effettuare attività di ''[[IP spoofing|spoof identify]]'', modificare dati esistenti, causare ''repudiation
* ''[[Cross-site scripting
* ''[[Cross-site request forgery
* Iniezione di oggetti PHP. Si verifica quando un'applicazione PHP prende l'[[input]] dell'utente e lo passa a una funzione chiamata <code>unserialize()</code> che prende un oggetto immagazzinato e lo trasforma in un oggetto in memoria.
* ''Remote'' e ''Local File Inclusion'' (RFI e LFI). Quando un'applicazione PHP accetta l'input dell'utente e lo passa a una funzione progettata per caricare un file. Se questo file è un URL, la funzione può caricare codice PHP da un altro sito Web specificato da un utente malintenzionato che verrà quindi eseguito sul sito Web attaccato. Le funzioni che possono essere suscettibili a RFI e LFI in PHP sono: {{Codice|codice=include|linguaggio=PHP}}''
== Esempi di codice ==
{{Organizzare|Stile manualistico. Va bene qualche breve esempio, ma meglio non duplicare la corrispettiva voce su Wikiversità|informatica|luglio 2023}}
Il seguente programma "[[Hello, World!]]" è scritto in codice PHP incorporato in un documento [[HTML]]:
<syntaxhighlight lang="html+php" highlight="7-9" line="1">
<!DOCTYPE html>
<html>
Line 105 ⟶ 106:
=== Variabili ===
I nomi di variabili in PHP iniziano sempre con il simbolo del dollaro (<code>$</code>) e il carattere successivo non deve essere un numero,
I nomi delle variabili sono [[Sensibile alle maiuscole|case-sensitive]], ovvero <code>$ancora</code> e <code>$ANCORA</code> sono due variabili distinte.
Una variabile può contenere tutti i caratteri <code>A-Z</code> , <code>a-z</code> , <code>0-9</code> e <code>_</code>. Una volta definite esse vengono istanziate senza definirne esplicitamente il "tipo":
<syntaxhighlight lang="php">$ciao = "Ciao mondo!";</syntaxhighlight>
Per mostrare il contenuto di <code>$ciao</code>, è possibile usare l'istruzione {{Codice|codice=echo|linguaggio=PHP}}:
<syntaxhighlight lang="php">echo $ciao;</syntaxhighlight>
che visualizza <code>Ciao mondo!</code>. Se invece la variabile <code>$ciao</code> non esistesse generalmente {{Codice|codice=echo|linguaggio=PHP}} genererebbe un errore non fatale (<code>Notice</code>).
==== Stringhe ====
In PHP una [[Stringa (informatica)|stringa]] di caratteri alfanumerici si rappresenta in due modi: racchiudendola tra apici doppi (
<syntaxhighlight lang="php">echo "Ciao vale: $ciao";</syntaxhighlight>
Stampa: <code>
Esempio di composizione della frase "Wikipedia è meravigliosa" in due modi: usando gli apici singoli e doppi:
<syntaxhighlight lang="php" line="1">
<?php
$uno = 'Wikipedia';
$due = 'è';
Line 131 ⟶ 138:
==== Array (e foreach) ====
PHP gestisce gli [[array]] come delle [[Array associativo|mappe associative]], ossia come un elenco di chiavi associate univocamente a un certo valore. Gli array in PHP possono perciò essere usati come una comune matrice, come una lista (vettore), uno stack, una coda o altro. Inoltre un qualsiasi elemento dell'array può a sua volta contenere altri array, anche multidimensionali<ref name="PHP-manuale-array">{{Cita web |url=http://it2.php.net/manual/it/language.types.array.php |titolo=Manuale PHP - array |accesso=14 marzo 2018 |urlarchivio=https://web.archive.org/web/20180315003659/http://it2.php.net/manual/it/language.types.array.php |urlmorto=sì }}</ref> e tutti gli elementi dell'array o dei sotto-array possono essere fra loro di tipi di variabile diversi, dando così la possibilità di creare [[Struttura dati|strutture dati]] complesse.
Gli array sono dinamici, infatti possono essere rimossi tramite <code>unset();</code><ref>{{Cita web|url=https://www.php.net/manual/en/function.unset.php|titolo=PHP: unset - Manual|accesso=17 ottobre 2020}}</ref>.
Dato che gli array in PHP sono associativi, possono essere usati tramite un costrutto chiamato
Codice d'esempio di un array associativo in cui
<syntaxhighlight lang="php" line="1">
<?php
$residenti =
$somma = 0;
foreach ($residenti as $città => $nResidenti) {
echo "La città $città ha $nResidenti abitanti";
$somma += $nResidenti;
Line 154 ⟶ 162:
echo "In tutto ci sono $somma abitanti!";
</syntaxhighlight>
L'output del codice è: <code>La città Torino ha {{formatnum:908551}} abitanti. La città Milano ha {{formatnum:1315791}} abitanti. La città Roma ha {{formatnum:2753000}} abitanti. In tutto ci sono {{formatnum:4977342}} abitanti</code>
Per approfondimenti vedere la
=== Funzioni ===
Le
Esempio di funzione con un parametro obbligatorio e uno opzionale con valore predefinito.
<syntaxhighlight lang="php" line="1">
<?php
/**
Line 171 ⟶ 179:
* e massimo 3
*/
function somma(int $n1 = 0, int $n2 = 0, int $n3 = 0): int {
return $n1 + $n2 + $n3;
}
echo somma(1, 5); //OUTPUT: 6
echo somma(1, 24); //OUTPUT: 25
echo somma(3, 4, 2); //OUTPUT: 9
echo somma(n1: 5, n3: 5); //OUTPUT: 10
</syntaxhighlight>
Qualunque variabile di qualunque tipo creata dentro alla funzione è
Esempio:
<syntaxhighlight lang="php" line="1">
<?php
function esperimento(): void {
global $a;
$a = "tre";
Line 201 ⟶ 208:
esperimento();
echo "Dopo: $a $b";
</syntaxhighlight>
Il risultato sarà: <code>Prima uno due Durante tre quattro Dopo tre due</code>.
=== Inclusioni ===
È possibile includere
Per farlo si utilizza una delle seguenti istruzioni: <code>{{Codice|codice=include|linguaggio=PHP}}</code><ref>{{Cita web |url=http://www.php.net/manual/it/function.include.php |titolo=Manuale PHP - include |accesso=31 gennaio 2014 |dataarchivio=1 febbraio 2014 |urlarchivio=https://web.archive.org/web/20140201220826/http://www.php.net/manual/it/function.include.php |urlmorto=sì }}</ref>, <code>{{Codice|codice=include_once|linguaggio=PHP}}</code><ref>{{Cita web |url=http://it2.php.net/manual/it/function.include-once.php |titolo=Manuale PHP - include_once |accesso=31 gennaio 2014 |urlarchivio=https://web.archive.org/web/20140201220826/http://it2.php.net/manual/it/function.include-once.php |urlmorto=sì }}</ref>, <code>{{Codice|codice=require|linguaggio=PHP}}</code><ref>{{Cita web |url=http://it2.php.net/manual/it/function.require.php |titolo=Manuale PHP - require |accesso=31 gennaio 2014 |urlarchivio=https://web.archive.org/web/20140201220829/http://it2.php.net/manual/it/function.require.php |urlmorto=sì }}</ref> e <code>{{Codice|codice=require_once|linguaggio=PHP}}</code><ref>{{Cita web |url=http://it2.php.net/manual/it/function.require-once.php |titolo=Manuale PHP - require_once |accesso=31 gennaio 2014 |urlarchivio=https://web.archive.org/web/20140201220832/http://it2.php.net/manual/it/function.require-once.php |urlmorto=sì }}</ref>. Esempio:
<syntaxhighlight lang="php" line="1">
<?php
include 'header.php';
echo "Ciao mondo!";
include 'footer.php';
Tipi di inclusione:
* Si usa <code>{{Codice|codice=include|linguaggio=PHP}}</code> quando si vuole che venga inviato soltanto un
* Si usa <code>{{Codice|codice=require|linguaggio=PHP}}</code> quando si vuole che venga inviato un
* Si usa <code>{{Codice|codice=include_once|linguaggio=PHP}}</code>, <code>{{Codice|codice=require_once|linguaggio=PHP}}</code> quando il comando potrebbe essere ripetuto più volte anche in file diversi, creando così (potenzialmente) una inclusione [[Ricorsività|ricorsiva]], ma si vuole che la pagina non venga inclusa più di una volta. Se la pagina da includere non esiste si comportano analogamente ai rispettivi sopra citati.
=== Gestione dei parametri ===
In questo esempio di gestione di un parametro GET, con la richiesta <code><nowiki>http://example.org/esempio.php?pippo=Ciao</nowiki></code>, il server caricherà contenuto del seguente codice e mostrerà sul browser <code>Ciao</code>.
<syntaxhighlight lang="php" line="1">
<?php
/*
Line 231 ⟶ 241:
*/
if (
$a = $_GET['pippo']; // Salvo nella variabile $a il parametro "pippo"
Line 240 ⟶ 250:
echo "Nessun parametro di nome pippo trovato. Devi inviarlo!";
}
</syntaxhighlight>
=== Una funzione con controllo sui parametri ===
<syntaxhighlight lang="php" line="1">
<?php
function get_hello_world(mixed $value1, mixed $value2): string {
/*
Line 254 ⟶ 263:
* ma è buona norma usarle sempre, per leggibilità del codice.
*/
}
}
/*
* !empty($value2) equivale a: $value2 != "" && $value2 != null
* Il "punto esclamativo" serve per negare un valore booleano
*/
if (!empty($value2)) {
$result .= $value2; // Equivale a: $result = $result . $value2;
}
Line 274 ⟶ 283:
echo get_hello_world('Hello', 'world');
</syntaxhighlight>
=== Il ciclo for ===
<syntaxhighlight lang="php" line="1">
<?php
/*
Line 285 ⟶ 293:
*/
for ($n = 0; $n <= 9; $n ++) {
echo $n;
}
// Output -> 0123456789
</syntaxhighlight>
=== Il ciclo while ===
<syntaxhighlight lang="php" line="1">
<?php
/*
Line 305 ⟶ 312:
$result = $mysqli->query("SELECT id FROM persone");
while ($row = $result->fetch_assoc()) {
echo $row['id'] . "<br />";
}
Line 313 ⟶ 320:
* sotto forma di array che verrà poi stampato tramite un ciclo while
*/
</syntaxhighlight>
=== 99 Bottles of Beer ===
Il seguente esempio stampa il testo della canzone ''[[99 Bottles of Beer]]''.
<syntaxhighlight lang="php" line="1">
<?php
/*
Line 332 ⟶ 338:
* Restituisce una "s" se l'argomento passato non è 1.
*/
function plural(int $number): string {
// L'operatore ternario (!= ? :) è una struttura condizionale
// simile a if-else: (condizione ? true : false)
Line 342 ⟶ 348:
$a_capo = "<br />\r\n";
for ($i = 99; $i > 0; $i--) {
echo "$i bottle" . plural($i) . " of beer on the wall,$a_capo";
// Non abbiamo bisogno di ripetere il comando echo per ogni riga:
Line 359 ⟶ 365:
}
echo "Go to the store, $a_capo buy some more, $a_capo 99 bottles of beer on the wall!";
</syntaxhighlight>
=== Esempio connessione con base di dati MySQL usando l'estensione MySQLi ===
Il PHP permette l'elaborazione di dati da base di dati MySQL. I dati verranno richiesti, inseriti e modificati attraverso opportune ''query'' usando alcune
L'estensione
Esempio di connessione a base di dati e richiesta di un dato:
<syntaxhighlight lang="php" line="1">
<?php
// Connessione a MySQL con l'estensione MySQLi
Line 376 ⟶ 381:
/*
* Questo è il modo ufficiale di controllare se una connessione MySQL è fallita,
*/
if (null !== $mysqli->connect_error) {
die("Connessione fallita, motivi: " . $mysqli->connect_error);
}
// Proviamo una query ipotizzando che stiamo elaborando dati provenienti da una simil-rubrica:
$SQLQuery = $mysqli->query("SELECT indirizzo, telefono FROM utenti WHERE nome = 'Francesca'
// Da questa query otterremo l'indirizzo e il telefono della persona di nome Francesca,
// ipotizzando sia presente nella tabella utenti della base di dati in questione.
// Ora "trasformiamo" i dati ricevuti dalla query in un array associativo, utilizzabile successivamente
$row = $SQLQuery->fetch_assoc();
Line 396 ⟶ 400:
// Chiusura della connessione alla base di dati
$mysqli->close();
</syntaxhighlight>
Line 402 ⟶ 405:
== php.ini ==
Il [[file di configurazione]] di PHP, chiamato <code>php3.ini</code> in PHP 3, e poi semplicemente php.ini nelle versioni successive, è letto all'avvio dell'interprete del linguaggio e fornisce le impostazioni dei vari moduli con cui l'interprete è stato compilato. Nella versione server modulare di PHP, questo avviene solo una volta, all'avvio del [[Web Server|server web]]. Per le versioni [[Common Gateway Interface|CGI]] e [[Interfaccia a riga di comando|CLI]], invece, è invocato
Per visualizzare tutte le opzioni di configurazione è possibile utilizzare la funzione <code>phpinfo()</code>.
Line 474 ⟶ 477:
|style="background:silver;"|6.x
|Non pubblicato
|{{TBA|testo=N/A|align=left}}
|-
|{{Version|o|7.0}}
Line 496 ⟶ 499:
|28 novembre 2022
|-
|{{Version|
|26 novembre 2020
|26 novembre 2023
Line 502 ⟶ 505:
|{{Version|co|8.1}}
|25 novembre 2021
|31 dicembre 2025
|-
|{{Version|
|8 dicembre 2022
|
|-
|{{Version|co|8.3}}
|23 novembre 2023
|31 dicembre 2027
|-
|{{Version|c|8.4}}
|21 novembre 2024
|31 dicembre 2028
|-
| colspan="3" | {{Version|l|show=111111}}
|}
==
=== Uso di PHP nei CMS ===
Grazie alle caratteristiche del linguaggio di programmazione è stato possibile realizzare [[Content management system|CMS (Content Management Systems)]] modulari dove attraverso file <code>.php</code> è possibile integrare e migliorare le funzionalità del software (come accade con [[Plugin (informatica)|plugin]] e temi in WordPress).<ref>{{Cita web|url=https://codex.wordpress.org/it:Scrivi_un_Plugin|titolo=it:Scrivi un Plugin « WordPress Codex|lingua=en|accesso=2022-10-06}}</ref> La complementarità tra linguaggio PHP e l'utilizzo di database relazionali interrogabili con l'[[Structured Query Language|SQL]] consente la creazione di CMS dinamici che portano alla realizzazione di siti web dalla struttura estremamente flessibile.
Alcuni dei CMS più diffusi che usano PHP sono:<ref>{{Cita web|url=https://www.plesk.com/blog/various/top-10-php-cms-platforms-for-developers-in-2020/|titolo=Top 10 PHP CMS Platforms For Developers in 2022|sito=plesk.com|data=2022-08-07|lingua=en|accesso=2022-10-06}}</ref>
* [[WordPress]]
Line 522 ⟶ 535:
* [[TYPO3]]
=== Uso di PHP nei MVC
Tra i più
== Note ==
Line 583 ⟶ 563:
== Voci correlate ==
{{Div col}}
* [[PHP Standard Recommendation]]
* [[LAMP]]
Line 594 ⟶ 575:
* [[HTML]]
* [[CSS]]
{{Div col end}}
== Altri progetti ==
Line 600 ⟶ 582:
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|PHP: Hypertext Preprocessor|PHP: Hypertext Preprocessor}}
* {{Cita web|url=https://secure.php.net/manual/en/history.php.php|titolo=Storia di PHP|autore=The PHP group|sito=secure.php.net|lingua=en}}
{{PHP}}
{{Framework per applicazioni web}}
{{Principali linguaggi di programmazione}}
|