PHP 7 - Guida rapida

Cos'è PHP 7?

PHP 7 è una delle principali versioni del linguaggio di programmazione PHP ed è considerato una rivoluzione nel modo in cui le applicazioni web possono essere sviluppate e fornite per dispositivi mobili alle imprese e al cloud. Questa versione è considerata la modifica più importante per PHP dopo il rilascio di PHP 5 nel 2004.

Nuove caratteristiche

Ci sono dozzine di funzionalità aggiunte a PHP 7, le più significative sono menzionate di seguito:

  • Improved performance - Con il codice PHPNG unito in PHP7, è due volte più veloce di PHP 5.

  • Lower Memory Consumption - PHP 7 ottimizzato utilizza risorse minori.

  • Scalar type declarations - Ora è possibile applicare i tipi di parametri e restituiti.

  • Consistent 64-bit support - Supporto coerente per macchine con architettura a 64 bit.

  • Improved Exception hierarchy - La gerarchia delle eccezioni è migliorata.

  • Many fatal errors converted to Exceptions - La gamma di eccezioni è aumentata coprendo molti errori fatali convertiti in eccezioni.

  • Secure random number generator - Aggiunta di una nuova API sicura per il generatore di numeri casuali.

  • Deprecated SAPIs and extensions removed - Vari SAPI ed estensioni vecchie e non supportate vengono rimosse dall'ultima versione.

  • The null coalescing operator (??) - Aggiunto nuovo operatore di coalescenza nullo.

  • Return and Scalar Type Declarations - Aggiunto supporto per il tipo di ritorno e il tipo di parametro.

  • Anonymous Classes - Aggiunto supporto per anonimo.

  • Zero cost asserts - Aggiunto supporto per asserzione a costo zero.

PHP 7 utilizza il nuovo Zend Engine 3.0 per migliorare le prestazioni delle applicazioni quasi due volte e il 50% in più di consumo di memoria rispetto a PHP 5.6. Permette di servire più utenti simultanei senza richiedere alcun hardware aggiuntivo. PHP 7 è stato progettato e modificato considerando i carichi di lavoro odierni.

Secondo il team di Zend , le seguenti illustrazioni mostrano il confronto delle prestazioni di PHP 7 vs PHP 5.6 e HHVM 3.7 sulle popolari applicazioni basate su PHP.

Magento 1.9

PHP 7 si dimostra più del doppio più veloce rispetto a PHP 5.6 durante l'esecuzione di transazioni Magento.

Drupal 7

PHP 7 si dimostra più del doppio più veloce, rispetto a PHP 5.6, durante l'esecuzione delle transazioni Drupal.

Wordpress 3.6

PHP 7 si dimostra più del doppio più veloce rispetto a PHP 5.6 durante l'esecuzione di transazioni Wordpress.

Confronto dei linguaggi dinamici

Provalo Opzione online

Abbiamo impostato l'ambiente di programmazione PHP on-line, in modo che tu possa compilare ed eseguire tutti gli esempi disponibili online. Ti dà fiducia in ciò che stai leggendo e ti consente di verificare i programmi con diverse opzioni. Sentiti libero di modificare qualsiasi esempio ed eseguirlo online.

Prova il seguente esempio utilizzando il nostro compilatore online disponibile su CodingGround.

<html>
   <head>
      <title>Online PHP Script Execution</title>
   </head>
   <body>
      <?php
         echo "<h1>Hello, PHP!</h1>";
      ?>   
   </body>
</html>

Per la maggior parte degli esempi forniti in questo tutorial, troverai un file Try itopzione nelle sezioni del codice del nostro sito Web nell'angolo in alto a destra che ti porterà al compilatore online. Quindi usa e goditi il ​​tuo apprendimento.

Per sviluppare ed eseguire pagine Web PHP, è necessario installare tre componenti vitali sul sistema del computer.

  • Web Server- PHP funziona praticamente con tutti i software Web Server, incluso Internet Information Server (IIS) di Microsoft, ma il più utilizzato è Apache Server. Scarica Apache gratuitamente qui -http://httpd.apache.org/download.cgi

  • Database- PHP PHP funziona praticamente con tutti i software di database, inclusi Oracle e Sybase, ma il database più comunemente utilizzato è MySQL. Scarica MySQL gratuitamente qui -http://www.mysql.com/downloads/

  • PHP Parser- Per elaborare le istruzioni dello script PHP, è necessario installare un parser per generare l'output HTML che può essere inviato al browser web. Questo tutorial ti guiderà come installare il parser PHP sul tuo computer.

Installazione del parser PHP

Prima di procedere, è importante assicurarsi di disporre di un'adeguata configurazione dell'ambiente sulla macchina per sviluppare i programmi web utilizzando PHP. Memorizza il seguente file php nella cartella htdocs di Apache.

phpinfo.php

<?php
   phpinfo();
?>

Digita il seguente indirizzo nella casella degli indirizzi del browser.

http://127.0.0.1/phpinfo.php

Se viene visualizzata una pagina che mostra le informazioni relative all'installazione di PHP, significa che PHP e Webserver sono installati correttamente. Altrimenti, devi seguire la procedura indicata per installare PHP sul tuo computer.

Questa sezione ti guiderà a installare e configurare PHP sulle seguenti quattro piattaforme:

Configurazione di Apache

Se stai usando Apache come server web, questa sezione ti guiderà a modificare i file di configurazione di Apache.

Controlla qui - Configurazione PHP in Apache Server

Configurazione del file PHP.INI

Il file di configurazione PHP, php.ini, è il modo finale e immediato per influenzare le funzionalità di PHP.

Controlla qui - Configurazione file PHP.INI

Configurazione di Windows IIS

Per configurare IIS sulla macchina Windows, è possibile fare riferimento al manuale di riferimento di IIS fornito insieme a IIS.

In PHP 7 è stata introdotta una nuova funzionalità, le dichiarazioni di tipo scalare. La dichiarazione di tipo scalare ha due opzioni:

  • coercive - coercitivo è la modalità predefinita e non è necessario specificarlo.

  • strict - La modalità rigorosa deve essere esplicitamente suggerita.

I seguenti tipi di parametri di funzione possono essere applicati utilizzando le modalità precedenti:

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Esempio: modalità coercitiva

<?php
   // Coercive mode
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Produce il seguente output del browser:

9

Esempio: modalità rigorosa

<?php
   // Strict mode
   declare(strict_types=1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }
   print(sum(2, '3', 4.1));
?>

Produce il seguente output del browser:

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...

In PHP 7, una nuova funzionalità, Return type declarationsè stato introdotto. La dichiarazione del tipo restituito specifica il tipo di valore che una funzione deve restituire. È possibile dichiarare i seguenti tipi di tipi restituiti.

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

Esempio: tipo restituito valido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value;
   }
   print(returnIntValue(5));
?>

Produce il seguente output del browser:

5

Esempio: tipo restituito non valido

<?php
   declare(strict_types = 1);
   function returnIntValue(int $value): int {
      return $value + 1.0;
   }
   print(returnIntValue(5));
?>

Produce il seguente output del browser:

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

In PHP 7, una nuova funzionalità, null coalescing operator (??)è stato introdotto. Viene utilizzato per sostituire il fileternaryoperazione in congiunzione con la funzione isset (). IlNullL'operatore coalescente restituisce il suo primo operando se esiste e non è NULL; altrimenti restituisce il suo secondo operando.

Esempio

<?php
   // fetch the value of $_GET['user'] and returns 'not passed'
   // if username is not passed
   $username = $_GET['username'] ?? 'not passed';
   print($username);
   print("<br/>");

   // Equivalent code using ternary operator
   $username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
   print($username);
   print("<br/>");
   // Chaining ?? operation
   $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
   print($username);
?>

Produce il seguente output del browser:

not passed
not passed
not passed

In PHP 7 è stata introdotta una nuova funzionalità, l'operatore di astronave. Viene utilizzato per confrontare due espressioni. Restituisce -1, 0 o 1 quando la prima espressione è rispettivamente minore, uguale o maggiore della seconda espressione.

Esempio

<?php
   //integer comparison
   print( 1 <=> 1);print("<br/>");
   print( 1 <=> 2);print("<br/>");
   print( 2 <=> 1);print("<br/>");
   print("<br/>");
   
   //float comparison
   print( 1.5 <=> 1.5);print("<br/>");
   print( 1.5 <=> 2.5);print("<br/>");
   print( 2.5 <=> 1.5);print("<br/>");
   print("<br/>");
   
   //string comparison
   print( "a" <=> "a");print("<br/>");
   print( "a" <=> "b");print("<br/>");
   print( "b" <=> "a");print("<br/>");
?>

Produce il seguente output del browser:

0
-1
1

0
-1
1

0
-1
1

Le costanti di matrice possono ora essere definite utilizzando il define()funzione. In PHP 5.6, potevano essere definiti solo usandoconst parola chiave.

Esempio

<?php
   //define a array using define function
   define('animals', [
      'dog',
      'cat',
      'bird'
   ]);
   print(animals[1]);
?>

Produce il seguente output del browser:

cat

Le classi anonime possono ora essere definite utilizzando la nuova classe. La classe anonima può essere utilizzata al posto di una definizione di classe completa.

Esempio

<?php
   interface Logger {
      public function log(string $msg);
   }

   class Application {
      private $logger;

      public function getLogger(): Logger {
         return $this->logger;
      }

      public function setLogger(Logger $logger) {
         $this->logger = $logger;
      }  
   }

   $app = new Application;
   $app->setLogger(new class implements Logger {
      public function log(string $msg) {
         print($msg);
      }
   });

   $app->getLogger()->log("My first Log Message");
?>

Produce il seguente output del browser:

My first Log Message

Closure::call()viene aggiunto come scorciatoia per associare temporaneamente l'ambito di un oggetto a una chiusura e richiamarlo. È molto più veloce in termini di prestazioni rispetto abindTo di PHP 5.6.

Esempio: pre PHP 7

<?php
   class A {
      private $x = 1;
   }

   // Define a closure Pre PHP 7 code
   $getValue = function() {
      return $this->x;
   };

   // Bind a clousure
   $value = $getValue->bindTo(new A, 'A'); 

   print($value());
?>

Produce il seguente output del browser:

1

Esempio: PHP 7+

<?php
   class A {
      private $x = 1;
   }

   // PHP 7+ code, Define
   $value = function() {
      return $this->x;
   };

   print($value->call(new A));
?>

Produce il seguente output del browser:

1

PHP 7 introduce Filtered unserialize()funzione per fornire una migliore sicurezza durante la deserializzazione di oggetti su dati non attendibili. Impedisce possibili iniezioni di codice e consente allo sviluppatore di autorizzare le classi che possono essere non serializzate.

Esempio

<?php
   class MyClass1 { 
      public $obj1prop;   
   }
   class MyClass2 {
      public $obj2prop;
   }

   $obj1 = new MyClass1();
   $obj1->obj1prop = 1;
   $obj2 = new MyClass2();
   $obj2->obj2prop = 2;

   $serializedObj1 = serialize($obj1);
   $serializedObj2 = serialize($obj2);

   // default behaviour that accepts all classes
   // second argument can be ommited.
   // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
   $data = unserialize($serializedObj1 , ["allowed_classes" => true]);

   // converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
   $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

   print($data->obj1prop);
   print("<br/>");
   print($data2->obj2prop);
?>

Produce il seguente output del browser:

1
2

In PHP7, un nuovo IntlCharviene aggiunta la classe, che cerca di esporre funzionalità aggiuntive di ICU. Questa classe definisce una serie di metodi e costanti statici, che possono essere utilizzati per manipolare i caratteri Unicode. Hai bisogno di avereIntl estensione installata prima di utilizzare questa classe.

Esempio

<?php
   printf('%x', IntlChar::CODEPOINT_MAX);
   print (IntlChar::charName('@'));
   print(IntlChar::ispunct('!'));
?>

Produce il seguente output del browser:

10ffff
COMMERCIAL AT
true

In PHP 7, vengono introdotte due nuove funzioni per generare interi e stringhe crittograficamente sicuri in modo multipiattaforma.

  • random_bytes() - Genera byte pseudo-casuali crittograficamente sicuri.

  • random_int() - Genera interi pseudo-casuali crittograficamente sicuri.

random_bytes ()

random_bytes () genera una stringa di lunghezza arbitraria di byte casuali crittografici che sono adatti per l'uso crittografico, come quando si generano sali, chiavi o vettori di inizializzazione.

Sintassi

string random_bytes ( int $length )

Parametri

  • length - La lunghezza della stringa casuale che deve essere restituita in byte.

Valori restituiti

  • Restituisce una stringa contenente il numero richiesto di byte casuali protetti crittograficamente.

Errori / eccezioni

  • Se non è possibile trovare una fonte appropriata di casualità, verrà generata un'eccezione.

  • Se vengono forniti parametri non validi, a TypeError sarà lanciato.

  • Se viene fornita una lunghezza di byte non valida, verrà generato un errore.

Esempio

<?php
   $bytes = random_bytes(5);
   print(bin2hex($bytes));
?>

Produce il seguente output del browser:

54cc305593

random_int ()

random_int() genera numeri interi casuali crittografici che sono adatti per l'uso dove i risultati imparziali sono fondamentali.

Sintassi

int random_int ( int $min , int $max )

Parametri

  • min - Il valore più basso da restituire, che deve essere PHP_INT_MIN o più alto.

  • max - Il valore più alto da restituire, che deve essere minore o uguale a PHP_INT_MAX.

Valori restituiti

  • Restituisce un numero intero casuale crittograficamente sicuro compreso tra il minimo e il massimo, inclusi.

Errori / eccezioni

  • Se non è possibile trovare una fonte appropriata di casualità, un file Exception sarà lanciato.

  • Se vengono forniti parametri non validi, a TypeError sarà lanciato.

  • Se max è minore di min, un Error sarà lanciato.

Esempio

<?php
   print(random_int(100, 999));
   print(" ");
   print(random_int(-1000, 0));
?>

Produce il seguente output del browser:

614
-882

Expectationssono un miglioramento compatibile con le versioni precedenti della vecchia funzione assert (). L'aspettativa consente asserzioni a costo zero nel codice di produzione e offre la possibilità di generare eccezioni personalizzate quando l'asserzione fallisce. assert () è ora un costrutto di linguaggio, in cui il primo parametro è un'espressione rispetto ad essere una stringa o un booleano da testare.

Direttive di configurazione per assert ()

Direttiva Valore predefinito Possibili valori
zend.assertions 1

1 - generare ed eseguire codice (modalità di sviluppo)

0 - genera codice ma saltaci intorno in fase di esecuzione

-1 - non generare codice (modalità di produzione)

assert.exception 0

1 - throw, quando l'asserzione fallisce, sia lanciando l'oggetto fornito come eccezione sia lanciandone uno nuovo AssertionError oggetto se l'eccezione non è stata fornita.

0 - usa o genera un Throwable come descritto sopra, ma genera solo un avviso basato su quell'oggetto piuttosto che lanciarlo (compatibile con il comportamento di PHP 5)

Parametri

  • assertion- L'asserzione. In PHP 5, deve essere una stringa da valutare o un booleano da testare. In PHP 7, questa può anche essere qualsiasi espressione che restituisce un valore, che verrà eseguito e il risultato viene utilizzato per indicare se l'asserzione è riuscita o meno.

  • description - Una descrizione facoltativa che verrà inclusa nel messaggio di errore, se l'asserzione non riesce.

  • exception - In PHP 7, il secondo parametro può essere un file Throwable oggetto invece di una stringa descrittiva, nel qual caso questo è l'oggetto che verrà lanciato, se l'asserzione fallisce e il assert.exception la direttiva di configurazione è abilitata.

Valori restituiti

FALSE se l'affermazione è falsa, TRUE altrimenti.

Esempio

<?php
   ini_set('assert.exception', 1);

   class CustomError extends AssertionError {}

   assert(false, new CustomError('Custom Error Message!'));
?>

Produce il seguente output del browser:

Fatal error: Uncaught CustomError: Custom Error Message! in...

Da PHP7 in poi, una singola istruzione use può essere utilizzata per importare Classi, funzioni e costanti dallo stesso spazio dei nomi invece di più istruzioni use.

Esempio

<?php
   // Before PHP 7
   use com\tutorialspoint\ClassA;
   use com\tutorialspoint\ClassB;
   use com\tutorialspoint\ClassC as C;

   use function com\tutorialspoint\fn_a;
   use function com\tutorialspoint\fn_b;
   use function com\tutorialspoint\fn_c;

   use const com\tutorialspoint\ConstA;
   use const com\tutorialspoint\ConstB;
   use const com\tutorialspoint\ConstC;

   // PHP 7+ code
   use com\tutorialspoint\{ClassA, ClassB, ClassC as C};
   use function com\tutorialspoint\{fn_a, fn_b, fn_c};
   use const com\tutorialspoint\{ConstA, ConstB, ConstC};

?>

Da PHP 7, la gestione e la segnalazione degli errori sono state modificate. Invece di segnalare gli errori tramite il tradizionale meccanismo di segnalazione degli errori utilizzato da PHP 5, ora la maggior parte degli errori viene gestita generando eccezioni di errore. Analogamente alle eccezioni, queste eccezioni di errore si espandono fino a raggiungere il primo blocco catch corrispondente. Se non ci sono blocchi corrispondenti, viene installato un gestore di eccezioni predefinito conset_exception_handler()sarà chiamato. Nel caso in cui non sia presente un gestore di eccezioni predefinito, l'eccezione verrà convertita in un errore irreversibile e verrà gestita come un errore tradizionale.

Poiché la gerarchia degli errori non è estesa da Exception, il codice che utilizza i blocchi catch (Exception $ e) {...} per gestire le eccezioni non rilevate in PHP 5 non gestirà tali errori. Un blocco catch (Error $ e) {...} o un fileset_exception_handler() il gestore è necessario per gestire gli errori irreversibili.

Esempio

<?php
   class MathOperations {
      protected $n = 10;

      // Try to get the Division by Zero error object and display as Exception
      public function doOperation(): string {
         try {
            $value = $this->n % 0;
            return $value;
         } catch (DivisionByZeroError $e) {
            return $e->getMessage();
         }
      }
   }

   $mathOperationsObj = new MathOperations();
   print($mathOperationsObj->doOperation());
?>

Produce il seguente output del browser:

Modulo by zero

PHP 7 introduce una nuova funzione intdiv(), che esegue la divisione intera dei suoi operandi e restituisce la divisione come int.

Esempio

<?php
   $value = intdiv(10,3);
   var_dump($value);
   print(" ");
   print($value);
?>

Produce il seguente output del browser:

int(3) 
3

Da PHP7 +, session_start() funzione accetta una serie di opzioni per sovrascrivere le direttive di configurazione della sessione impostate in php.ini. Queste opzioni supportanosession.lazy_write, che è attivo per impostazione predefinita e fa sì che PHP sovrascriva qualsiasi file di sessione se i dati della sessione sono cambiati.

Un'altra opzione aggiunta è read_and_close, che indica che i dati della sessione devono essere letti e quindi la sessione deve essere chiusa immediatamente senza modifiche. Ad esempio, Setsession.cache_limiter su privato e impostare il flag per chiudere la sessione immediatamente dopo averla letta, utilizzando il seguente frammento di codice.

<?php
   session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
   ]);
?>

Le seguenti funzionalità sono deprecate e potrebbero essere rimosse dalle versioni future di PHP.

Costruttori di stile PHP 4

I costruttori in stile PHP 4 sono metodi che hanno lo stesso nome della classe in cui sono definiti, sono ora deprecati e verranno rimossi in futuro. PHP 7 emetterà E_DEPRECATED se un costruttore PHP 4 è l'unico costruttore definito all'interno di una classe. Le classi che implementano un metodo __construct () non sono interessate.

Esempio

<?php
   class A {
      function A() {
         print('Style Constructor');
      }
   }
?>

Produce il seguente output del browser:

Deprecated: Methods with the same name as their class will not be constructors 
in a future version of PHP; A has a deprecated constructor in...

Chiamate statiche a metodi non statici

Le chiamate statiche a metodi non statici sono deprecate e potrebbero essere rimosse in futuro.

Esempio

<?php
   class A {
      function b() {
         print('Non-static call');
      }
   }
   A::b();
?>

Produce il seguente output del browser:

Deprecated: Non-static method A::b() should not be called statically in...
Non-static call

password_hash () opzione salt

L'opzione di sale per il password_hash()la funzione è stata deprecata in modo che gli sviluppatori non generino i propri sali (di solito non sicuri). La funzione stessa genera un sale crittograficamente sicuro, quando non viene fornito alcun sale dallo sviluppatore, quindi la generazione di sale personalizzata non è più richiesta.

opzione di contesto SSL capture_session_meta

Il capture_session_metaL'opzione del contesto SSL è stata deprecata. I metadati SSL vengono ora utilizzati tramitestream_get_meta_data() funzione.

Le seguenti estensioni sono state rimosse da PHP 7 in poi -

  • ereg
  • mssql
  • mysql
  • sybase_ct

I seguenti SAPI sono stati rimossi da PHP 7 in poi -

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames